注:本实验来源于 实验楼:python3简明教程 作者: FrostSigh
索引:
项目 | Value |
---|---|
1,定义一个函数 | 对函数的定义和调用 |
2,局部或全局变量 | global 及几个例子 |
3,默认参数值 | 默认参数的机种情况(易错点) |
4,关键字参数 | 关键字参数使用 |
5,强制关键字参数 | 强制使用规则 |
6,文档字符串 | 调用函数文档 |
7,高阶函数 | 什么是高阶函数 (map()函数) |
1,定义一个函数
使用关键字def来定义一个函数,语法:
def 函数名(参数):
语句1
语句2
例:
def sum(a, b):
return a + b
res = sum(3, 5)
print(res)
例:根据上次写的回文检查程序,写一个函数,然后返回True 或者 false
def palindrom(s):
return s == s[::-1] #如果s == s[::-1]返回True,反之返回Flase
if __name__ == '__main__': #如果函数名称是main就执行。
s = input("Enter a string: ")
'''调用palindrom()函数,并传递参数s;如果返回True,执行if块;如果返回False,执行else块'''
if palindrom(s):
print("Yes!")
else:
print("No!")
2,局域或全局变量
通过几个例子搞清楚全局变量和局部变量。
def change():
a = 90
print(a)
a = 9
print("Before the function call ", a)
print("Inside change function ", end=' ')
change()
print("After the function call ", a)
"""
先对a赋值9,然后打印此时的a,调用change()函数,在函数内部对a赋值90,打印此时的a
。然后函数返回到原来位置的下一个指令,打印此时的a
--当我们在函数里写a = 90时,实际上创建了一个新的名为a的局部变量,这个变量只在函数里可用,
并且会在函数完成时销毁,即使这两个变量的名字相同,但他们不是同一个变量。
"""
print("-" * 50)
a = 9
def change():
print(a)
change()
"""
先对a赋值9,然后调用change()函数,打印变量a的值
--在外面的a可作为全局变量
"""
print("-" * 50)
'''
a = 9
def change():
print(a)
a = 100
change()
"""
出错原因:在change()函数内部重新定义了一个局部变量。在执行print(a)时,不知道此时的
局部变量a的值,所以会报错。
"""
'''
a = 9
def change():
global a
print(a)
a = 100
print("Before the function call ", a)
print("Inside change function ", end=' ')
change()
print("After the function call ", a)
"""
先对a赋值9,然后打印此时的a,调用change()函数,打印全局变量a;然后对全局变量a进行赋值100
,打印此时的a
---此时函数体能访问全局变量,。
"""
print("-" * 50)
def change():
global a
a = 90
print(a)
a = 9
print("Before the function call ", a)
print("Inside change function ", end = ' ')
change()
print("After the function call ", a)
"""
先对a赋值9,然后打印此时的a;调用change()函数,把a作为全局变量,对全局变量a赋值90,打印
此时的a;然后打印此时的全局变量a
----通过关键字global,来告诉a的定义是全局的,因此在函数内部更改了a的值,函数外的a的值也
实际更改了。
"""
3,默认参数值
函数的参数可以有默认值,就是说我们如果对指定的参数变量没有给出任何值则会赋其默认值。
例如:
有两个非常重要的地方:
其一,具有默认值的参数后面不能再有普通参数。比如:
f(a, b=90, c)
就是错误的。
其二,默认值只被赋值一次,因此如果默认值是任何可变对象时会有所不同。例如:
def f(a, data=[]):
data.append(a)
return data
print(f(1))
print(f(2))
print(f(3))
如列表,字典或大多数类的实例。此函数在调用过程中会累积传给它的参数。
可以修改为:
def f(a, data=None):
if data is None:
data = []
data.append(a)
return data
print(f(1))
print(f(2))
print(f(3))
4,关键字参数
函数可以通过关键字参数的形式来调用,形如 keyword = value
def func(a, b=5, c=10):
print('a is', a, 'and b is', b, 'and c is', c, end = ' ')
func(12, 24)
print()
func(12, b=3)
print()
func(32, c=12, b=32)
print()
在函数调用时使用了变量名,比如f(12, c=23),我们将24赋值给c且b具有默认值。这就是关键字参数。
5,强制关键字参数
我们将函数的参数标记为只允许使用关键字参数。用户调用函数时只能对每一个参数使用相应的关键字参数。
6,文档字符串
在python里我们使用文档字符串来说明如何使用代码。这对于交互模式非常有用,也能用于自动创建文档。
例:
import math
def longest_side(a, b):
"""
用函数来计算三角形的最长边的值:
:a边:三角形的a边
:b边:三角形的b边
:return:第三条边(最长边)的长度,浮点型
"""
return math.sqrt(a*a + b*b)
if __name__ == '__main__':
print(longest_side.__doc__)
print(longest_side(3, 4))
print(longest_side(7, 9))
通过调用函数的文档(longest.doc)对交互模式有很大作用。
7,高阶函数
高阶函数或仿函数可以接受函数作为参数的函数:
- 使用一个或多个函数作为参数
- 返回另一个函数作为输出
例:
#定义一个函数
def high(st):
'''接受一个列表参数,然后返回列表中的每一个元素的大写形式'''
return [i.upper() for i in st]
#定义一个高阶函数
def test(f, st):
'''接受一个函数作为第一个参数,一个列表为第二个参数;然后返回第一个参数的调用结果'''
return f(st)
#定义一个列表
lst = ['python', 'Linux', 'Git']
#调用高阶函数test()并传递一个函数参数和一个列表
print(test(high, lst))
map()函数 :
map是python里非常有用的高阶函数。它接受一个函数和一个序列(迭代器)作为输入,然后对序列(迭代器)的每一个值应用这个函数,返回一个序列(迭代器),其包含应用函数后的结果。
例如:
lst = [1, 2, 3, 4, 5]
def square(num):
'''返回所给数的平方'''
return num*num
#调用map()函数,并向它传递1个函数和一个列表,然后以列表形式打印
print(list(map(square, lst)))