自定义函数
自定义函数就是自己编写函数,以方便自己后续使用。函数的基本样式如下:
你可以定义一个由自己想要功能的函数,以下是简单的规则:
- 函数代码块以 def 关键词开头,后接函数标识符名称和圆括号 ()。
- 任何传入参数和自变量必须放在圆括号中间,圆括号之间可以用于定义参数。
- 函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明。
- 函数内容以冒号 : 起始,并且缩进。
- return 表达式 结束函数,选择性地返回一个值给调用方,不带表达式的 return 相当于返回 None。
def {function}({parameters}):
{statements}
return {value}
接下来,我们来实现一个阶乘函数 factorial:
def factorial(number):
result = 1
for i in range(1, number + 1):
result *= i
return result
f1 = factorial(5)
f2 = factorial(10)
print(f1)
print(f2)
这个阶乘函数叫 factorial,可以自己定义,命名规则参照变量命名规则。
它接收一个参数 number。
函数代码是实现阶乘功能。
最终 return 返回阶乘计算结果。
调用 factorial(5)后会得到 5 的阶乘结果,存储在 f1 里。
调用 factorial(10)后会得到 10 的阶乘结果,存储在 f2 里。
参数传递
在讲列表的时候,我们讲了地址引用与值引用,在函数的参数传递时,这个概念尤为重要。请运行以下代码:
def update(number, lists):
number = 10
lists[0] = 10
number1 = 20
lists1 = [1,2,3]
update(number1,lists1)
print(number1) #输出20,不变
print(lists1) #输出[10,2,3],变了
在上述代码中
- number1 是值引用,所以在 update 函数里,number 是一个独立的值,修改 number,并不能影响 number1。
- lists1 是地址引用,所以实际上传递给 lists 的是地址,所以 lists 和 lists1 指向的是同一个地址,修改 lists 里的值,就是修改 lists1 里的值。
函数作用域
函数里的参数和变量和外面的变量是相互独立的关系,就算命名相同,函数内部的参数,也不会影响外面的变量,只会影响函数内部的代码,函数内部的变量,外面不能访问。
def update(number):
number = 10
number2 = 20
number = 20
update(number)
print(number) #输出20,不变
print(number2) #报错
在上述代码中,函数里的 number 不能修改外面 number 的值,函数里的 number2,外面不能访问。
全局变量和局部变量
有了函数之后,外面就有了全局变量的概念。
- 在函数外部声明的变量是全局变量
- 在函数内部声明的变量是局部变量
def double():
number2 = number + number #局部变量
print('number2:',number2) #输出40
number = 20 #全局变量
double()
print('number:',number) #输出20,不变
print(number2) #报错
上面已经演示了函数可以访问全局变量 number,但函数外面不能访问局部变量 number2。
一般不建议在函数内部访问与修改全局变量,应该尽量使用函数传递与返回值的方法来与全局变量交互。例如:
def update(number):
number = 10
return number
number = 20
number = update(number)
print(number) #输出10,变了
如果一定要在函数内部修改全局变量,可以使用 global 语句来标记。
def update():
global number
number = 10
number = 20
update()
print(number) #输出10,变了
参数声明
以下是调用函数时可使用的正式参数类型:
- 必需参数
- 关键字参数
- 默认参数
- 不定长参数
必需参数
必需参数须以正确的顺序传入函数。调用时的数量必须和声明时的一样。
例如 factorial() 函数必须传入一个参数,不然会出现语法错误:
def factorial(number):
result = 1
for i in range(1, number + 1):
result *= i
return result
f1 = factorial(5)
print(f1)
f2 = factorial()#报错
默认参数
可以在声明函数时,指定参数的默认值,这样在调用函数时,如果没有传递参数,则会使用默认参数。
def printInfo(name, age = 18):
print('My name is {}, and I am {} years old'.format(name,age))
printInfo('Oldmoon')
关键字参数
关键字参数和函数调用关系紧密,函数调用使用关键字参数来确定传入的参数值。
使用关键字参数允许函数调用时参数的顺序与声明时不一致,因为 Python 解释器能够用参数名匹配参数值。
def printInfo(name, age):
print('My name is {}, and I am {} years old'.format(name,age))
printInfo(age = 18, name = 'Oldmoon') #使用关键字参数时,参数传递顺序可以不一致
不定长参数
有的时候,函数需要接受非固定长度的参数,此时可以使用星号 * 来实现。 加了星号 * 的参数会以元组(tuple)的形式导入,存放所有未命名的变量参数。
def total(*numbers):
summary = 0
#print('numbers',numbers) #可以打印出numbers看看效果
for i in numbers:
summary += i
return summary
#传递任意数量的参数给total都可以
print(total(1,2,3)) #输出6
print(total(1,2)) #输出3
匿名函数
Python 使用 lambda 来创建匿名函数。
lambda [arg1 [,arg2,.....argn]]:statements
所谓匿名,意即不再使用 def 语句这样标准的形式定义一个函数。
- lambda 只是一个表达式,函数体比 def 简单很多。
- lambda 的主体是一个表达式,而不是一个代码块。仅仅能在 lambda 表达式中封装有限的逻辑进去。
- lambda 函数拥有自己的命名空间,且不能访问自己参数列表之外或全局命名空间里的参数。
- 虽然 lambda 函数看起来只能写一行,却不等同于 C 或 C++ 的内联函数,后者的目的是调用小函数时不占用栈内存从而增加运行效率。
一个实现计算平方数的匿名函数示例代码:
square = lambda a : a * a
print(square(3)) #输出9
模块化编程
下面使用自定义函数来实现模块化编程,画一颗任意形状和高度的树,让代码结构更加清晰。
def printLine(symbol, space_count, symbol_count):
print(' '*space_count+symbol*symbol_count)
def printTree(symbol, top_height, bottom_height):
for i in range(top_height):
printLine(symbol,top_height-i-1,2*i+1)
for j in range(bottom_height):
space_count = (2*top_height-1)//3
width = (2*top_height-1) - 2*space_count
printLine(symbol,space_count,width)
def draw():
symbol, top_height, bottom_height=input().split()
top_height=int(top_height)
bottom_height=int(bottom_height)
printTree(symbol,top_height,bottom_height)
draw()
以下选项中,符合 Python 语言变量命名规则的是( )。
def update(number):
global number
number = 10
return number
number = 20
update(number)
print(number)
程序会输出:。
def update(number):
number = 10
return number
number = 20
number = update(number)
print(number)
程序会输出:。
def update(number, lists):
number = 1
lists[0] = 2
number1 = 2
lists1 = [1,2,3]
update(number1,lists1)
print(number1,lists1[0])
程序会输出:。
a = 'app'
b = 'hi ' + a
c = b*2
print(c)
程序会输出?
变量a='apple',以下哪个代码可以将a变成'bpple'?