「Python教程06」函数

Python学习笔记

作者: Duter2016 | 2019-09-24 | 阅读
「编辑」 「本文源码」

1、如果调用print()或len()函数,你会传入一些值,放在括号之间,在这里称为“参数”。也可以自己定义接收参数的函数。在文件编辑器中输入这个例子,将它保存为helloFunc2.py:

 def hello(name):
	 print('Hello ' + name)
 hello('Alice')
   hello('Bob')

如果运行这个程序,输出看起来像这样:

Hello Alice
Hello Bob

在这个程序的hello()函数定义中,有一个名为name的变元❶。“变元”是一个变量,当函数被调用时,参数就存放在其中。hello()函数第一次被调用时,使用的参数是’Alice’❸。程序执行进入该函数,变量name自动设为’Alice’,就是被print()语句打印出的内容❷。
关于变元有一件特殊的事情值得注意:保存在变元中的值,在函数返回后就丢失了。例如前面的程序,如果你在hello(‘Bob’)之后添加print(name),程序会报NameError,因为没有名为name的变量。

2、返回值和return语句
一般来说,函数调用求值的结果,称为函数的“返回值”。
用def语句创建函数时,可以用return语句指定应该返回什么值。return语句包含以下部分:
• return关键字;
• 函数应该返回的值或表达式。

import random
def getAnswer(answerNumber):
   if answerNumber == 1:
       return 1+2
   elif answerNumber == 2:
       return 'yes'
r = random.randint(1,2)
fortune = getAnswer(r)
print(fortune)

3、在Python中有一个值称为None,它表示没有值。None是NoneType数据类型的唯一值。None必须大写首字母N。

4、“关键字参数”是由函数调用时加在它们前面的关键字来识别的。关键字参数通常用于可选变元。例如,print()函数有可选的变元end和sep,分别指定在参数末尾打印什么,以及在参数之间打印什么来隔开它们。
如果运行以下程序:

print('Hello')
print('World')

输出将会是:

Hello
World

这两个字符串出现在独立的两行中,因为print()函数自动在传入的字符串末尾添加了换行符。但是,可以设置end关键字参数,将它变成另一个字符串。例如,如果程序像这样:

print('Hello', end='')
print('World')

输出就会像这样: HelloWorld

输出被打印在一行中,因为在’Hello’后面不再打印换行,而是打印了一个空字符串。如果需要禁用加到每一个print()函数调用末尾的换行,这就很有用。
类似地,如果向print()传入多个字符串值,该函数就会自动用一个空格分隔它们。在交互式环境中输入以下代码:

>>> print('cats', 'dogs', 'mice')
cats dogs mice

但是你可以传入sep关键字参数,替换掉默认的分隔字符串。在交互式环境中输入以下代码:

>>> print('cats', 'dogs', 'mice', sep=',')
cats,dogs,mice

5、作用域很重要,理由如下:
• 全局作用域中的代码不能使用任何局部变量;
• 但是,局部作用域可以访问全局变量;
• 一个函数的局部作用域中的代码,不能使用其他局部作用域中的变量。
• 如果在不同的作用域中,你可以用相同的名字命名不同的变量。也就是说,可以有一个名为spam的局部变量,和一个名为spam的全局变量。

6、global语句
如果需要在一个函数内修改全局变量,就使用global语句。如果在函数的顶部有global eggs这样的代码,它就告诉Python,“在这个函数中,eggs指的是全局变量,所以不要用这个名字创建一个局部变量。”例如,在文件编辑器中输入以下代码,并保存为sameName2.py:

 def spam():
	❶ global eggs
	❷ eggs = 'spam'

 eggs = 'global'
 spam()

 print(eggs)运行该程序,最后的print()调用将输出:

spam

因为eggs在spam()的顶部被声明为global❶,所以当eggs被赋值为’spam’时❷,赋值发生在全局作用域的spam上。没有创建局部spam变量。

有4条法则,来区分一个变量是处于局部作用域还是全局作用域:
(1)如果变量在全局作用域中使用(即在所有函数之外),它就总是全局变量。
(2)如果在一个函数中,有针对该变量的global语句,它就是全局变量。
(3)否则,如果该变量用于函数中的赋值语句,它就是局部变量。
(4)但是,如果该变量没有用在赋值语句中,它就是全局变量。
为了更好地理解这些法则,这里有一个例子程序。在文件编辑器中输入以下代码,并保存为sameName3.py:

  def spam():
	❶ global eggs
 	   eggs = 'spam' # this is the global

  def bacon():
	❷ eggs = 'bacon' # this is a local
  def ham():
	❸ print(eggs) # this is the global

  eggs = 42 # this is the global
  spam()
  print(eggs)

在spam()函数中,eggs是全局eggs变量,因为在函数的开始处,有针对eggs变量的global语句❶。在bacon()中,eggs是局部变量,因为在该函数中有针对它的赋值语句❷。在ham()中❸,eggs是全局变量,因为在这个函数中,既没有赋值语句,也没有针对它的global语句。如果运行sameName3.py,输出将是: spam

++在一个函数中,一个变量要么总是全局变量,要么总是局部变量。函数中的代码没有办法先使用名为eggs的局部变量,稍后又在同一个函数中使用全局eggs变量。
如果想在一个函数中修改全局变量中存储的值,就必须对该变量使用global语句。++

7、异常处理:try和except
错误可以由try和except语句来处理。那些可能出错的语句被放在try子句中。如果错误发生,程序执行就转到接下来的except子句开始处。
可以将前面除数为零的代码放在一个try子句中,让except子句包含代码,来处理该错误发生时应该做的事。

def spam(divideBy):
	try:
		return 42 / divideBy
	except ZeroDivisionError:
		print('Error: Invalid argument.')
print(spam(2))
print(spam(12))
print(spam(0))
print(spam(1))

如果在try子句中的代码导致一个错误,程序执行就立即转到except子句的代码。在运行那些代码之后,执行照常继续。前面程序的输出如下:

21.0
3.5
Error: Invalid argument.
None
42.0

请注意,在函数调用中的try语句块中,发生的所有错误都会被捕捉。


版权声明:本文由 Duter2016 在 2019年09月24日发表。本文采用CC BY-NC-SA 4.0许可协议,非商业转载请注明出处,不得用于商业目的。
文章题目及链接:《「Python教程06」函数》




  相关文章:

「游客及非Github用户留言」:

「Github登录用户留言」:

TOP