【6】函数

  1. 现在开始深入我们提到的第四种基本模式:存储与重用。

核心思想是“不要重复你自己”

四种基本模式是什么呢?

循环执行,条件判断,循环迭代,以及存储与重用。

存储与重用就是不要重复自己理念,(Don't Repeat Yourself),函数正是我们存储并重用的工具。

使用函数

def是definite(定义)的缩写,它是一个关键字,它以冒号结尾,就像许多开启缩进代码块的语句一样。用来告诉Python,“记住这个函数的含义!下次说到的时候就是让你做这个重复操作。”所以实际上不会执行。当调用时,它会回到定义的地方并执行定义函数中缩进的代码,执行完之后又回到你调用的地方继续往下执行。

图片

示例1

为存储的内容命名,如图的thing,然后括号,内部可以有一些可选的参数,关键要理解,当python解析或者查看这段代码时,它事实上不会执行,下面两个可以执行的语句,分别是print print,但是它所做的,只是记住这些内容。(很像把这些内容存储到一个类似变量的区域中)

thing()(无参)就是调用函数的语法,当调用的时候,它会回到定义的地方并执行那两行代码,因此输出结果是Hello Fun,然后再回来执行print(‘zip’),输出zip,然后再运行一遍,就和上图右侧结果一样

小结一下:函数是一段可重复使用的代码,我们def保留字来定义函数,当你调用函数时,往往还需要提供一些信息:函数名、括号,有时还需要参数。之后我们会讨论如何创建并使用我们自己定义的函数。就像是你创建了新的保留字或变量名称,因此需要避免使用保留字或其他类似的名称。

    图片

    Python有一些内置的函数,max 是一个我们还没见过的。

      图片

      示例2

      我们传入一个字符串,并询问:‘max’函数用于找到某个序列中最大值,在这里它会扫描这个字符串并找到最大的字母,于是判定w是最大的字母。显然,小字母比大字母的数值更大。接着,它执行所谓的返回操作,将结果交还给我们。于是,w就被赋值给了变量‘big’.同理,min函数就是反过来的。(出于某种原因,空格字符被判定为最小的字符)

      内置函数也遵从自定义函数一样的逻辑,有输入,有调用,有输出。

      图片

      max函数某种程度可以看作:python内置的一段代码块,我们传入一个参数,这个参数是一个字符串,在这段代码的内部,陈旭会运行并遍历传入的参数,逐一检查内容,w的值就会被赋给赋值语句的左侧变量big就是max函数执行后返回的值。

      类型的转换

      下图中,python会判断打印之前有哪些函数要先执行。

      图片

      float转化;type说明一下i的类型,是整数.....

      💡看完后要理解:函数调用就像是暂时暂停我们当前的操作,稍等一下,随后函数会返回一个值来替换它。

      字符串函int()和上面的浮点函float()也是类似的。但函数本身也可能会出错:

      图片

      input函数,它总是返回一个字符串,我们可能需要将其作为数字来使用。因此字符串“1-2-3”与数字123是不一样的,比如我们在给它加1(如第四行),我们就会得到回溯错误,应为无法将字符串和整数拼接在一起,仅仅是因为类型不匹配。如果我们处理同样的123,这里就会有int函数的一小段代码,最终就会得到123被赋值给ival。就可以加1了

      常用的12种内置函数,作为新手,你并不需要记忆所有,能看懂就行。

      图片

      构建函数

      我们已经简单讨论过一点def的语法结构:仅用于定义函数。

      图片

      def 函数名(参数1, 参数2, ..., 参数n): 
          """写一下函数文档字符串说明函数是在干嘛防止人类看不懂(可选)"""
          #函数体代码
          #往往是一些内置函数比如:
          print("Hello,Datawhale")
          return 返回值  # 可选

      图片

      def的没有执行是因为没有调用该函数

      如何调用:print_lyrics()会执行其内部代码。

      图片

      调用函数时会发生什么?

      1. 一旦我们定义了一个函数,我们可以根据需要调用(或调用)它任意多次。这就是存储和重用模式。

      2. 参数值(Arguments)是我们调用函数时作为输入传递给函数的值。我们使用参数值,以便在不同时间调用函数时可以指示函数执行不同类型的工作。我们将参数值放在函数名称后面的括号内,就像是给变量赋值。

      图片

      =(代表:箭头指向) 'Hello world',表示这是参数。

      >>> def greet(lang):  # lang 是参数,可以理解为一个别名。
      ...     if lang == 'es':
      ...         print('Hola')
      ...     elif lang == 'fr':
      ...         print('Bonjour')
      ...     else:
      ...         print('Hello')
      ...
      >>> greet('en')  # 'en' 是参数值
      Hello
      >>> greet('es')  # 'es' 是参数值
      Hola
      >>> greet('fr')  # 'fr' 是参数值
      Bonjour

      参数(Parameters)是我们定义函数时给输入参数值留的位置,

      图片

      1. 我们可以对比一下Argument(参数值,又叫实参)和Parameter(参数)的区别。

      打个比方来对比:参数值(A)与参数(P)

      1. 返回值:

      图片

      返回值实际是在做两件事:

      1. 停止函数

      2. 输出一个值

      图片

      图片

      再次回到max函数,理解return的工作原理

      图片

      无返回值函数(无效函数)

      当函数不返回任何值时,我们称其为“无返回值”函数,会返回值的函数称为“有返回值”函数,无返回值函数是“不产生结果”的。

      要不要用函数呢?函数化还是不函数化...

      1. 将代码组织成"段落"形式 - 捕捉完整逻辑并"命名封装"

      2. 避免重复造轮子 - 实现一次功能即可重复调用

      3. 当代码过长或过于复杂时,应将其拆分为逻辑块并通过函数封装

      4. 建立常用功能库 - 你甚至可以与伙伴们共享这些封装好的函数...

      练习

      1.在你的系统上运行程序,看看你得到什么数。多次运行程序,看看你得到什么数。random 函数只是处理随机数函数中的一个。函数 randint 接受参数 low 和 high ,并返回一个介于 low 和 high 之间的整数(包括两端)。

      >>>import random
      >>> random.randint(5, 10)

      2.将这个程序的最后一行repeat_lyrics()移到顶部,使函数调用出现在定义之前。运行程序并看看你得到什么错误消息。

      def print_lyrics():
          print("I'm a lumberjack, and I'm okay.")
          print('I sleep all night and I work all day.')
      
      
      def repeat_lyrics():
          print_lyrics()
          print_lyrics()
      
      repeat_lyrics()
      # Code: https://www.py4e.com/code3/lyrics.py 

      3.将函数调用移回底部,并将 print_lyrics 的定义移到 repeat_lyrics 的定义之后。运行这个程序会发生什么?

      def print_lyrics():
          print("I'm a lumberjack, and I'm okay.")
          print('I sleep all night and I work all day.')
      
      
      def repeat_lyrics():
          print_lyrics()
          print_lyrics()
      
      repeat_lyrics()

      4.“def” 关键字在 Python 中的目的是什么?

      A.它是一种俚语,意思是“接下来的代码真的很酷”

      B.它表示函数的开始

      C.它表示接下来的缩进代码段将被存储以供以后使用

      D. b 和 c 都为真

      E. 以上皆非

      5.以下 Python 程序将输出什么?

      def fred():
         print("Zap")
      
      def jane():
         print("ABC")
      
      jane()
      fred()
      jane()

      A.Zap

      ABC

      jane

      fred

      jane

      B.

      Zap

      ABC

      Zap

      C.

      ABC

      Zap

      jane

      D.

      ABC

      Zap

      ABC

      6.使用加班一倍半的工资重新编写你的工资计算程序,并创建一个名为 computepay 的函数,该函数接受两个参数( hours 和 rate )。

      Enter Hours: 45
      
      Enter Rate: 10
      
      Pay: 475.0

      7.编写一个程序,使用名为 computegrade 的函数,接收一个表示分数的浮点数作为参数,并根据下表返回对应的等级字符串:

      此外,如果输入的值不是合法的数字,或者不在 0 到 1.0 的范围内,程序应输出 "Bad score"。

      版权所有:知识共享署名 3.0 - 查尔斯·R·塞维森

      评论
      添加红包

      请填写红包祝福语或标题

      红包个数最小为10个

      红包金额最低5元

      当前余额3.43前往充值 >
      需支付:10.00
      成就一亿技术人!
      领取后你会自动成为博主和红包主的粉丝 规则
      hope_wisdom
      发出的红包
      实付
      使用余额支付
      点击重新获取
      扫码支付
      钱包余额 0

      抵扣说明:

      1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
      2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

      余额充值