函数是一段用于执行特定的任务的可重复使用的代码块。它可以接受输入参数,并返回输出结果。Python提供了许多内置函数,也允许进行自定义函数。
函数的定义以关键字def开始,后面跟着函数名和一对圆括号,圆括号中可以包含参数列表。函数体由冒号和缩进的代码块组成。函数可以通过return语句返回一个值,也可以不显式返回值(返回None)。函数可以在程序的任何地方被调用,通过函数名和参数列表来调用函数。
函数中可为参数和返回值作注解,类型注解并不进行强制检查,但有些IDE或者包可以利用注解改善自动提示或代码生成。在函数体的开始,可以用"“” “”"来定义文档字符串,说明代码的目的、用法和行为等,也可以用于生成文档或在交互式环境中提供帮助。
def mult(x:'str|num',n:int=2)->'output':
"""返回字符重复或数字相乘"""
return x*n
mult('Jack')
'JackJack'
参数用来命名函数调用时的输入值,调用时可以依照函数定义时的顺序(位置)来传递,也可以依照函数定义的参数名(关键字)来传递,调用时,按位置传递的参数必须放在按关键字传递的参数之前。 可以用“/”符号作为占位参数来定义(其前为)仅按位置传递的参数,用“*”占位来定义(其后为)仅按参数名传递的关键字参数。如numpy库中的ceil函数:
ceil(x, /, out=None, *, where=True, casting=‘same_kind’, order=‘K’, dtype=None, subok=True[, signature, extobj])
也可以用“args”接受任意数量的非关键字参数,并保存为元组,而其后无法再按位置传递参数,但不限制其前按关键字传递的参数;"*kwargs"用来接受任意数量的关键字参数,并保存为字典。
def f(a, b=11, *x, c , d=12,**e): print(a, b, x, c, d,e)
f(1,2,3,4,5,6,c=7,f=8,g=9) # prints: 1 2 (3, 4, 5, 6) 7 12 {'f': 8, 'g': 9}
1 2 (3, 4, 5, 6) 7 12 {'f': 8, 'g': 9}
定义时还可以设定参数的默认值,调用时如果没有为该参数提供值,则使用默认值。有默认值的参数位置就当放在无默认值参数之后。
由于默认值只在函数定义时进行初始化,而不是每次调用时,因此如果默认值是可变对象(如列表或字典),并且在函数内部被修改,那么修改将在后续调用中保持。
def add_item(item, items=[]):
items.append(item)
print(id(items),items)
add_item("apple") # 输出 ["apple"]
add_item("banana") # 输出 ["apple", "banana"]
1818739817152 ['apple']
1818739817152 ['apple', 'banana']
类似的,如果传递的参数为可变对象,函数体内将其重新赋值(绑定)不会影响原对象内容;而在函数中的原地修改,则会影响到可变对象的内容。
def f(x, y):
#rebinding
x = x + [33]
#mutating
y += [44]
a = [11]
b = [22]
f(a, b)
print(a, b) # prints: [11] [22, 44]
[11] [22, 44]
函数参数和函数内部定义的变量和对象,构成了函数的本地命名空间,也称为局部作用域。调用函数时,会创建一个新的本地命名空间,并在其中存储局部变量或对象。函数内部的变量和对象无法被外部访问。但在函数内部可以访问外部命名空间中的变量和对象,而不能修改它们。如果需要修改,可以使用global来访问全局变量。
_count = 10
def counter():
global _count
_count += 1
return _count
print(counter(),counter(),counter())
11 12 13
对于内嵌函数,则利用nonlocal来访问或修改外部函数的局部变量。
def make_counter(x):
_count = x
def counter():
nonlocal _count
_count += 1
return _count
return counter
#closure
c01 = make_counter(0)
c10 = make_counter(10)
#nonlocal
print(c01(), c01())
print(c10(), c10())
print(c01(), c10())
1 2
11 12
3 13
上面示例中,对外部函数的调用返回的是一个闭包的函数对象,即内嵌函数和其引用环境的组合。然后调用闭包的函数,则可以访问保留的外部函数的状态/变量来进行计算。
如果函数仅包含一个返回表达式,则可以用lambda 表达式来代替。
a_list = [-2, -1, 0, 1, 2]
def square1(x):
return x * x
sorted(a_list, key=square1)
print(a_list)
square2 = lambda x:x*x
sorted(a_list, key=square2)
print(a_list)
sorted(a_list, key=lambda x: x * x)
print(a_list)
[-2, -1, 0, 1, 2]
[-2, -1, 0, 1, 2]
[-2, -1, 0, 1, 2]
python中还可以构建生成器函数,即包含yield关键字的函数。函数被调用时并不立即执行,而是生成一个迭代器对象。当使用next函数直接调用或在for语句中隐含调用,则会从入口或上次暂停位置运行到下一个yield关键字位置暂停,并返回相应的表达式计算值。
def updown(N):
for x in range(1, N):
yield x
yield from range(N, 0, -1)
for i in updown(3):
print(i)
1
2
3
2
1
还可以将yield表达式放在赋值语句的右侧,用来接收外部调用时传入的信息,并可在随后的语句执行时使用。因此,生成器函数可作为协程(Coroutine)的一种实现方法,即可在执行过程中暂停(yield)并恢复(resume),从而允许在单个线程中处理多个操作。
def my_coroutine():
received = 'Begin:'
while True:
print(received)
received = yield received.lower()
received=received.upper()
# 创建协程对象
coro = my_coroutine()
# 预激协和
# 起始运行->print->返回yield表达式结果->暂停
next(coro)
# 向协程发送数据
# 从暂停处接收数据->赋值received->print->返回yield表达式结果->暂停
coro.send('Hello')
#print 返回的yield表达式结果
print(coro.send('World'))
# 关闭协程
coro.close()
Begin:
HELLO
WORLD
world
python中的函数支持递归,即在定义的函数中调用函数本身。
#斐波那契数列:一对兔子每个月都生一对小兔子,而小兔子两个月后就开始生小小兔子
def rabbits(n):
if n == 0:
return 0
elif n == 1:
return 1
else:
return rabbits(n-1) + rabbits(n-2)
print(rabbits(10))
55
递归也可以用于生成器函数。
tree = (1, (10, (100, None,None ), (101, None, None)), (11,None, (111,None,None)))
# 二叉树的中序遍历
def inorder_traversal(t):
if t is None:
return
yield from inorder_traversal(t[1])
yield t[0]
yield from inorder_traversal(t[2])
print(list(inorder_traversal(tree))) # 输出:[4, 2, 5, 1, 3, 7]
[100, 10, 101, 1, 11, 111]
以上就是“python基础 | 函数”的全部内容,希望对你有所帮助。
?
?关于Python技术储备
学好 Python 不论是就业还是做副业赚钱都不错,但要学会 Python 还是要有一个学习规划。最后大家分享一份全套的 Python 学习资料,给那些想学习 Python 的小伙伴们一点帮助!
一、Python所有方向的学习路线
Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
二、Python必备开发工具
三、Python视频合集
观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。
四、实战案例
光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。
五、Python练习题
检查学习结果。
六、面试资料
我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。
最后祝大家天天进步!!
上面这份完整版的Python全套学习资料已经上传至CSDN官方,朋友如果需要可以直接微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】。