python基础 | 函数

发布时间:2024年01月19日

函数是一段用于执行特定的任务的可重复使用的代码块。它可以接受输入参数,并返回输出结果。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必备开发工具

img

三、Python视频合集

观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。

img

四、实战案例

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

img

五、Python练习题

检查学习结果。

img

六、面试资料

我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

img

最后祝大家天天进步!!

上面这份完整版的Python全套学习资料已经上传至CSDN官方,朋友如果需要可以直接微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】。

文章来源:https://blog.csdn.net/m0_59236127/article/details/135594716
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。