PYTHON基础技能 – 一键掌握:Python函数声明与调用的20个最佳实践

释放双眼,带上耳机,听听看~!

今天我们要一起探索的是Python世界中的一块基石——函数!想象一下,像魔术师一样,轻轻一挥手,复杂的任务就被封装成简洁的命令,这就是函数的魅力。下面,让我们用最接地气的方式,揭开它的神秘面纱,掌握那些让代码飞起来的20个小技巧。

1. 基础中的基础:Hello, Function!


1
def&nbsp;say_hello(name="World"):<br>&nbsp;&nbsp;&nbsp;&nbsp;print(f"Hello,&nbsp;{name}!")<br><br>say_hello("Pythonista")&nbsp;&nbsp;<em>#&nbsp;输出:&nbsp;Hello,&nbsp;Pythonista!</em>
  • 解密:
    1
    def

    是定义函数的关键词,

    1
    say_hello

    是函数名,括号内是参数,如果没有提供参数,就用默认值。

2. 参数传递:位置VS关键字


1
def&nbsp;greet(firstName,&nbsp;lastName):<br>&nbsp;&nbsp;&nbsp;&nbsp;print(f"Hi,&nbsp;I'm&nbsp;{firstName}&nbsp;{lastName}")<br><br>greet(lastName="Smith",&nbsp;firstName="John")&nbsp;&nbsp;<em>#&nbsp;明确指定参数名</em>
  • 小贴士:通过名字指定参数,让代码更易读,特别是参数多时。

3. *args 和 **kwargs:无限参数的秘密


1
def&nbsp;super_greet(*names):&nbsp;&nbsp;<em>#&nbsp;*args&nbsp;收集位置参数</em><br>&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;name&nbsp;in&nbsp;names:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print(f"Hello,&nbsp;{name}!")<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>super_greet("Alice",&nbsp;"Bob",&nbsp;"Charlie")&nbsp;&nbsp;<em>#&nbsp;多个名字一次性处理</em><br><br>def&nbsp;versatile_greet(**details):&nbsp;&nbsp;<em>#&nbsp;**kwargs&nbsp;收集关键字参数</em><br>&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;key,&nbsp;value&nbsp;in&nbsp;details.items():<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print(f"{key.title()}:&nbsp;{value}")<br><br>versatile_greet(age=25,&nbsp;city="New&nbsp;York")&nbsp;&nbsp;<em>#&nbsp;关键信息一网打尽</em>
  • 神奇之处:
    1
    *args

    1
    **kwargs

    让你的函数可以接受任意数量的参数,超级灵活!

4. 返回值不只是一个


1
def&nbsp;multiple_returns():<br>&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;"Success",&nbsp;200<br><br>result,&nbsp;status&nbsp;=&nbsp;multiple_returns()<br>print(result,&nbsp;status)&nbsp;&nbsp;<em>#&nbsp;输出:&nbsp;Success&nbsp;200</em>
  • 多才多艺:函数可以返回多个值,其实是以元组的形式返回的。

5. 文档字符串:让代码会说话


1
def&nbsp;calculate_area(radius):<br>&nbsp;&nbsp;&nbsp;&nbsp;"""<br>&nbsp;&nbsp;&nbsp;&nbsp;计算圆的面积。<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;参数:<br>&nbsp;&nbsp;&nbsp;&nbsp;radius&nbsp;(float):&nbsp;圆的半径<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;返回:<br>&nbsp;&nbsp;&nbsp;&nbsp;float:&nbsp;圆的面积<br>&nbsp;&nbsp;&nbsp;&nbsp;"""<br>&nbsp;&nbsp;&nbsp;&nbsp;import&nbsp;math<br>&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;math.pi&nbsp;*&nbsp;radius**2<br><br>print(calculate_area.__doc__)&nbsp;&nbsp;<em>#&nbsp;查看文档字符串</em>
  • 文明交流:良好的文档字符串是团队合作的润滑剂,也是自我复习的好帮手。

6. 默认参数的坑


1
def&nbsp;append_to_list(item,&nbsp;my_list=&#091;]):<br>&nbsp;&nbsp;&nbsp;&nbsp;my_list.append(item)<br>&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;my_list<br><br>print(append_to_list(1))&nbsp;&nbsp;<em>#&nbsp;&#091;1]</em><br>print(append_to_list(2))&nbsp;&nbsp;<em>#&nbsp;注意!这里会是&nbsp;&#091;1, 2],不是预期的&nbsp;&#091;2]</em>
  • 警告:默认参数在函数定义时就初始化了,多次调用时会保留之前的值,小心这个陷阱。

7. 变量作用域:谁能访问我?


1
x&nbsp;=&nbsp;"global"<br><br>def&nbsp;scope_test():<br>&nbsp;&nbsp;&nbsp;&nbsp;x&nbsp;=&nbsp;"local"<br>&nbsp;&nbsp;&nbsp;&nbsp;print(x)&nbsp;&nbsp;<em>#&nbsp;local</em><br><br>scope_test()<br>print(x)&nbsp;&nbsp;<em>#&nbsp;global</em>
  • 名字游戏:在函数内部定义的变量默认是局部的,不会影响到外部的同名变量。

8. 非局部变量的修改


1
y&nbsp;=&nbsp;10<br><br>def&nbsp;modify_outer():<br>&nbsp;&nbsp;&nbsp;&nbsp;global&nbsp;y&nbsp;&nbsp;<em>#&nbsp;告诉Python你想修改外部的y</em><br>&nbsp;&nbsp;&nbsp;&nbsp;y&nbsp;=&nbsp;20<br><br>modify_outer()<br>print(y)&nbsp;&nbsp;<em>#&nbsp;输出:&nbsp;20</em>
  • 特权操作:使用
    1
    global

    关键字可以让函数内部修改全局变量,但要谨慎使用。

9. 闭包:函数内的函数


1
def&nbsp;counter():<br>&nbsp;&nbsp;&nbsp;&nbsp;count&nbsp;=&nbsp;0<br>&nbsp;&nbsp;&nbsp;&nbsp;def&nbsp;increment():<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nonlocal&nbsp;count<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;count&nbsp;+=&nbsp;1<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;count<br>&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;increment<br><br>my_counter&nbsp;=&nbsp;counter()<br>print(my_counter())&nbsp;&nbsp;<em>#&nbsp;1</em><br>print(my_counter())&nbsp;&nbsp;<em>#&nbsp;2</em>
  • 内外有别:闭包允许内部函数访问并修改外部函数的变量,而外部函数返回的是内部函数的引用。

10. 装饰器:给函数穿上花衣


1
def&nbsp;my_decorator(func):<br>&nbsp;&nbsp;&nbsp;&nbsp;def&nbsp;wrapper():<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print("Something&nbsp;is&nbsp;happening&nbsp;before&nbsp;the&nbsp;function&nbsp;is&nbsp;called.")<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;func()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print("Something&nbsp;is&nbsp;happening&nbsp;after&nbsp;the&nbsp;function&nbsp;is&nbsp;called.")<br>&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;wrapper<br><br>@my_decorator<br>def&nbsp;say_hello():<br>&nbsp;&nbsp;&nbsp;&nbsp;print("Hello!")<br><br>say_hello()
  • 装饰生活,装饰函数:装饰器是Python的一大特色,它可以在不修改原函数代码的情况下增加新功能。

高级使用场景

11. 递归:自己调用自己的艺术


1
def&nbsp;factorial(n):<br>&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;n&nbsp;==&nbsp;1:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;1<br>&nbsp;&nbsp;&nbsp;&nbsp;else:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;n&nbsp;*&nbsp;factorial(n-1)<br><br>print(factorial(5))&nbsp;&nbsp;<em>#&nbsp;输出:&nbsp;120</em>
  • 无限循环的智慧:递归是解决某些问题的强大工具,但要注意避免无限循环,确保有一个清晰的终止条件。

12. 匿名函数lambda:简洁之美


1
double&nbsp;=&nbsp;lambda&nbsp;x:&nbsp;x&nbsp;*&nbsp;2<br>print(double(5))&nbsp;&nbsp;<em>#&nbsp;输出:&nbsp;10</em><br><br>squared&nbsp;=&nbsp;lambda&nbsp;x:&nbsp;x**2<br>numbers&nbsp;=&nbsp;&#091;1,&nbsp;2,&nbsp;3]<br>print(list(map(squared,&nbsp;numbers)))&nbsp;&nbsp;<em>#&nbsp;输出:&nbsp;&#091;1,&nbsp;4,&nbsp;9]</em>
  • 一闪即逝的美:lambda函数适合简单的操作,它们无需定义即可使用,非常适合用在高阶函数中。

13. map()函数:批量操作的艺术


1
def&nbsp;square(n):<br>&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;n*n<br><br>numbers&nbsp;=&nbsp;&#091;1,&nbsp;2,&nbsp;3,&nbsp;4]<br>squared_numbers&nbsp;=&nbsp;list(map(square,&nbsp;numbers))<br>print(squared_numbers)&nbsp;&nbsp;<em>#&nbsp;输出:&nbsp;&#091;1,&nbsp;4,&nbsp;9,&nbsp;16]</em><br><br><em>#&nbsp;或者用lambda简化</em><br>simplified&nbsp;=&nbsp;list(map(lambda&nbsp;x:&nbsp;x*x,&nbsp;numbers))<br>print(simplified)&nbsp;&nbsp;<em>#&nbsp;同上</em>
  • 批量处理好帮手:map函数对序列的每个元素应用指定函数,返回一个迭代器对象,通常转换为列表使用。

14. filter()函数:筛选高手


1
def&nbsp;is_even(n):<br>&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;n&nbsp;%&nbsp;2&nbsp;==&nbsp;0<br><br>numbers&nbsp;=&nbsp;&#091;1,&nbsp;2,&nbsp;3,&nbsp;4,&nbsp;5,&nbsp;6]<br>even_numbers&nbsp;=&nbsp;list(filter(is_even,&nbsp;numbers))<br>print(even_numbers)&nbsp;&nbsp;<em>#&nbsp;输出:&nbsp;&#091;2,&nbsp;4,&nbsp;6]</em><br><br><em>#&nbsp;简化版</em><br>even_with_lambda&nbsp;=&nbsp;list(filter(lambda&nbsp;x:&nbsp;x&nbsp;%&nbsp;2&nbsp;==&nbsp;0,&nbsp;numbers))<br>print(even_with_lambda)&nbsp;&nbsp;<em>#&nbsp;同上</em>
  • 只选对的:filter函数根据提供的函数来筛选序列中的元素,返回一个迭代器,同样常用list转换。

15. reduce()函数:累积计算的秘密武器


1
from&nbsp;functools&nbsp;import&nbsp;reduce<br><br>def&nbsp;accumulator(acc,&nbsp;item):<br>&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;acc&nbsp;+&nbsp;item<br><br>numbers&nbsp;=&nbsp;&#091;1,&nbsp;2,&nbsp;3,&nbsp;4]<br>sum_of_numbers&nbsp;=&nbsp;reduce(accumulator,&nbsp;numbers,&nbsp;0)<br>print(sum_of_numbers)&nbsp;&nbsp;<em>#&nbsp;输出:&nbsp;10</em><br><br><em>#&nbsp;或用lambda简化</em><br>sum_with_lambda&nbsp;=&nbsp;reduce(lambda&nbsp;acc,&nbsp;item:&nbsp;acc&nbsp;+&nbsp;item,&nbsp;numbers,&nbsp;0)<br>print(sum_with_lambda)&nbsp;&nbsp;<em>#&nbsp;同上</em>
  • 累积力量:reduce将一个函数应用于序列的所有元素,累积结果,非常适合求和、乘积等操作。

16. 偏函数partial:定制化的便捷


1
from&nbsp;functools&nbsp;import&nbsp;partial<br><br>def&nbsp;power(base,&nbsp;exponent):<br>&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;base&nbsp;**&nbsp;exponent<br><br>square&nbsp;=&nbsp;partial(power,&nbsp;exponent=2)<br>print(square(5))&nbsp;&nbsp;<em>#&nbsp;输出:&nbsp;25</em><br><br>cube&nbsp;=&nbsp;partial(power,&nbsp;exponent=3)<br>print(cube(3))&nbsp;&nbsp;<em>#&nbsp;输出:&nbsp;27</em>
  • 定制你的函数:偏函数可以固定原函数的部分参数,生成新的函数,非常适用于需要多次调用且参数变化不大的场景。

17. 递归优化与尾递归


1
<em>#&nbsp;注意:Python标准解释器不直接支持尾递归优化</em><br>def&nbsp;factorial_tail(n,&nbsp;accumulator=1):<br>&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;n&nbsp;==&nbsp;1:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;accumulator<br>&nbsp;&nbsp;&nbsp;&nbsp;else:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;factorial_tail(n-1,&nbsp;n*accumulator)<br><br>print(factorial_tail(5))&nbsp;&nbsp;<em>#&nbsp;输出:&nbsp;120</em>
  • 尾声:虽然Python没有内置的尾递归优化,理解尾递归的概念对理解函数调用栈很有帮助。

18. 闭包进阶:数据封装


1
def&nbsp;counter_maker():<br>&nbsp;&nbsp;&nbsp;&nbsp;count&nbsp;=&nbsp;0<br>&nbsp;&nbsp;&nbsp;&nbsp;def&nbsp;increment():<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nonlocal&nbsp;count<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;count&nbsp;+=&nbsp;1<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;count<br>&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;increment<br><br>counter1&nbsp;=&nbsp;counter_maker()<br>counter2&nbsp;=&nbsp;counter_maker()<br><br>print(counter1(),&nbsp;counter1())&nbsp;&nbsp;<em>#&nbsp;输出:&nbsp;1&nbsp;2</em><br>print(counter2(),&nbsp;counter2())&nbsp;&nbsp;<em>#&nbsp;输出:&nbsp;1&nbsp;2</em>
  • 工厂模式:闭包可以用来创建具有独立状态的函数,类似于面向对象中的实例。

19. 高阶函数:函数的函数


1
def&nbsp;apply_operation(func,&nbsp;a,&nbsp;b):<br>&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;func(a,&nbsp;b)<br><br>add&nbsp;=&nbsp;lambda&nbsp;x,&nbsp;y:&nbsp;x&nbsp;+&nbsp;y<br>subtract&nbsp;=&nbsp;lambda&nbsp;x,&nbsp;y:&nbsp;x&nbsp;-&nbsp;y<br><br>print(apply_operation(add,&nbsp;5,&nbsp;3))&nbsp;&nbsp;<em>#&nbsp;输出:&nbsp;8</em><br>print(apply_operation(subtract,&nbsp;5,&nbsp;3))&nbsp;&nbsp;<em>#&nbsp;输出:&nbsp;2</em>
  • 函数的魔力:高阶函数可以接受函数作为参数或返回函数,这是函数式编程的核心概念。

20. 装饰器进阶:带参数的装饰器


1
def&nbsp;repeat(n):<br>&nbsp;&nbsp;&nbsp;&nbsp;def&nbsp;decorator(func):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;def&nbsp;wrapper(*args,&nbsp;**kwargs):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;_&nbsp;in&nbsp;range(n):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;func(*args,&nbsp;**kwargs)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;wrapper<br>&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;decorator<br><br>@repeat(3)<br>def&nbsp;say_hello():<br>&nbsp;&nbsp;&nbsp;&nbsp;print("Hello!")<br><br>say_hello()&nbsp;&nbsp;<em>#&nbsp;输出:&nbsp;Hello!&nbsp;Hello!&nbsp;Hello!</em>
  • 装饰器的新维度:带参数的装饰器让装饰器本身也变得灵活,可以根据需要调整行为。

至此,我们探索了Python函数从基础到进阶的20个最佳实践,每一个点都是打开新视野的钥匙。

给TA打赏
共{{data.count}}人
人已打赏
安全运维

安全运维之道:发现、解决问题的有效闭环

2024-4-14 20:59:36

安全运维

稳定性建设 – 架构优化的关键策略

2025-2-11 17:15:56

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索