1.函数的定义
#函数的定义
#def 语句和参数
def hello(name):
print('hello' + name)
#调用函数
hello('lily')
hello('kity')
2.返回值和return语句
import random
def getAnswer(asNum):
if asNum == 1:
return 'it is certain'
elif asNum == 2:
return 'it is decidedly no'
elif asNum == 3:
return 'yes'
r = random.randint(1,3)
ret = getAnswer(r)
print(ret)
上述调用过程可以缩写为一行代码: print(getAnswer(random(1,9)))
3.None 值
None值是NoneType数据类型的唯一值,其他变成语言可能为NULL,nil或undefined。
没有返回值得函数可以将return语句返回None
4.关键字参数和print()
大多数参数是由他们在函数中调用的位置来识别的。例如random.randint(1,10)与random.randint(10,1)不同,函数调用random.randint(1,10)将返回1到10之间的一个随机整数,因为第一个参数是范围的下界,第二个参数是范围的下界。而random.randint(10,1)会导致错误。
但是“关键字参数”是有函数调用是加在他们前面的关键字来识别的,关键字参数通常用于可选变元。例如print()函数有可选的变元end和sep,分别指定在参数末尾打印什么,以及在参数之间打印什么来隔开他们,
例如:
print('helloe')
print('world')
输出会是
hello
world
因为print()函数自动在传入的字符串末尾添加了换行符,可以设置end关键字参数,将它变为另一个字符串,例如:
print('hello', end='')
print('world')
输出为
helloworld
例如还可以传入sep关键字参数,替换默认的分隔字符串。因为print()传入多个字符串值,该函数就会自动用一个空格分隔它们。
>>> print('cats','dogs','mice')
cats dogs mice
>>> print('cats','dogs','mice',sep=',')
cats,dogs,mice
也可以在自己编写的函数中添加关键字参数,但需要用到列表和字典数据类型,后面将会学习到。
5.局部和全局作用域
在被调用函数内部赋值的变元和变量,处于该函数的局部作用域内,称为局部变量,在所有函数之外赋值的变量,处于全局作用域,称为全局变量。
同其他编程语言相似,全局作用域中的代码不能使用任何局部变量,但是局部作用域可以访问全局变量。
规则:
<1>局部变量不能在全局作用域内使用
<2>局部作用域不能使用其他局部作用域内的变量
<3>全局变量可以在局部作用域中读取
6.global语句
如果需要在一个函数内修改全局变量,就使用global语句。如果在函数顶部有global eggs 这样的代码,它就告诉python,在这个函数中,eggs指的是全局变量,所以,应该避免使用这个名字在函数内创建变量。
def spam():
global eggs
eggs = 'spam' # this is the global
def bacon():
eggs = 'bacon' # this is a local
def ham():
print(egg) #this is the global
eggs = 42 #this is the global
spam()
print(eggs);
7.异常处理
到目前为止,在python程序中遇到错误或异常,以为这整个程序崩溃,那么如何使程序检测出错误并继续运行呢?
举个例子:除数为0的情况
def dodevid(devideBy):
try:
return 42 / devideBy
except ZeroDivisionError:
print('Error: Invalid argument.')
print(dodevid(2))
print(dodevid(12))
print(dodevid(0))
print(dodevid(1))
输出:
21.0
3.5
Error: Invalid argument.
None
42.0
如果没有try--except,将会在调用dodevid(0)的时候导致错误终端程序。
再来看另一个例子:
def dodevid(devideBy):
return 42 / devideBy
try:
print(dodevid(2))
print(dodevid(12))
print(dodevid(0))
print(dodevid(1))
except ZeroDivisionError:
print('Error: Invalid argument.')
输出:
21.0
3.5
Error: Invalid argument.
print(dodevid(1) )没有被调用就跳转到了except语句。
注意:
在函数中调用的try语句块中,发生的所有错误都会被捕捉。print(dodevid(1))从未被执行时因为,一旦执行调到except字句的代码,就不会回到try字句,它会继续照常向下执行。
下面贴一个小函数:collatz
#编写一个名为collatz()的函数,它有一个名为number的参数。如果参数是偶数,那么collatz()
#就打印出number//2,并返回该值,如果number是奇数,collatz()就打印并返回3*number+1;
#
#然后编写一个程序,让用户输入一个整数,并不断对这个数调用collatz(),知道函数返回值1,
#(令人惊奇的是,这个序列对于任何整数都有效,利用这个序列,你迟早会得到1)
#
#记得将input()返回值用int()函数专程一个整数,否则他会是一个字符串
#如果number%2==0,整数number就是偶数,如果number%2==1,他就是奇数
'''
这个程序的输出看起来应该像这样:
3
10
5
16
8
4
2
1
'''
def collatz(number):
procNum = 0
if number % 2 == 0:
procNum = number//2
print(procNum)
return procNum
elif number % 2 == 1 and number > 1:
procNum = 3 * number +1
print(procNum)
return procNum
elif number == 1:
print(number)
return number
def docollatz():
number = input('now,you can input a number to test>>')
try:
number = int(number)
except ValueError:
print("your input is not a number")
return 0;
while True:
number = collatz(number)
if number == 1:
break
docollatz()
输出:
now,you can input a number to test
100
50
25
76
38
19
58
29
88
44
22
11
34
17
52
26
13
40
20
10
5
16
8
4
2
1
总结:
函数是将代码逻辑分组的主要方式,因为函数中的变量存在于他们自己的局部作用域内,所以一个函数中的代码不能直接影响其他函数中的变量,这限制了那些代码才能改变那些变量的值,对于调试代码是很有帮助的。
在没有使用try之前,一个错误就会导致程序崩溃,利用try-except可以使程序自己检测到错误,并针对错误进行处理,继续运行后面的程序。
由于是C/C++开发出身,因此在写python程序的时候,总是不自觉地加上括号,分号结尾等,虽然没有错误,但还是要体现python的风格。