
Python学习(六)
发布日期:2021-05-07 06:37:10
浏览次数:23
分类:精选文章
本文共 3262 字,大约阅读时间需要 10 分钟。
Python 函数入门
调用函数
你可以通过help()
函数查看某个函数的帮助信息。例如:
help(abs)
调用函数时,可以通过函数名直接执行。例如:
print(abs(-10)) # 输出 10print(max(1, 2, 10)) # 输出 10
你也可以将函数赋值给变量,方便重命名或调用。例如:
a = absprint(a(10))
数据类型转换
可以通过内置函数将数据类型转换为字符串或布尔值。例如:
print(str(10)) # 输出 '10'print(bool(1)) # 输出 True
定义函数
(1)定义函数
使用def
语句定义函数。函数名后面跟括号,括号内写参数,最后跟冒号,函数体在缩进的代码块中。函数可以返回一个值,或者没有返回值(默认返回None
)。
def f(x): if x >= 0: print(1) return x else: return -x# 调用函数print(f(5)) # 输出 5print(f(-5)) # 输出 5
(2)参数检查
在函数定义时,可以对参数类型进行检查。例如:
def f(x): if not isinstance(x, (int, float)): raise TypeError('bad operand type') if x >= 0: return x else: return -x# 调用函数try: print(f('a')) # 会抛出TypeErrorexcept TypeError as e: print(e)
(3)返回多个值
函数可以返回多个值,使用元组形式表示。例如:
import mathdef move(x, y, step, angle=0): nx = x + step * math.cos(angle) ny = y - step * math.sin(angle) return (nx, ny)# 调用函数x, y = move(0, 0, 2, math.pi / 6)print(x, y) # 输出 (1.7320508075688774, -0.9999999999999999)
函数的参数
(0)位置参数
位置参数是按顺序传递的。例如:
def power(x): return x ** 2# 调用函数print(power(2)) # 输出 4
(1)默认参数
默认参数可以省略,使用=
指定默认值。例如:
def f(a, n=1): print(f'a = {a}, n = {n}') # 调用方式print(f(3)) # a = 3, n = 1print(f(3, 2)) # a = 3, n = 2
(2)默认参数指向不变对象
默认参数不能是可变对象(如列表或字典),否则会导致函数内部状态异常。正确做法是使用None
或不变对象。例如:
def add_end(L=None): if L is None: L = [] L.append('END') return L# 调用方式print(add_end([1, 2, 3])) # 输出 [1, 2, 3, 'END']print(add_end()) # 输出 ['END']
(3)可变参数
可变参数*args
接收任意个位置参数,自动组装为元组。例如:
def calc(*numbers): total = 0 for n in numbers: total += n ** 2 return total# 调用方式print(calc(1, 4, 9)) # 输出 100print(calc([1, 4, 9])) # 输出 100
(4)关键字参数
关键字参数**kw
接收含有参数名的关键字参数,自动组装为字典。例如:
def person(name, age, **kw): print(f'name: {name}, age: {age}, other: {kw}')# 调用方式print(person('M', 3)) # 输出 name: M, age: 3, other: {}print(person('A', 4, g='M', j='E')) # 输出 name: A, age: 4, other: {'g': 'M', 'j': 'E'}
(5)命名关键字参数
命名关键字参数可以指定特定的参数名。例如:
def person(name, age, *, city, job): print(f'name: {name}, age: {age}, city: {city}, job: {job}')# 调用方式print(person('Jack', 24, city='Beijing', job='Engineer')) # 输出 name: Jack, age: 24, city: Beijing, job: Engineer
(6)参数组合
参数定义顺序为:必选参数、默认参数、可变参数、命名关键字参数、关键字参数。例如:
def f2(a, b, c=0, *, d, **kw): print(f'a = {a}, b = {b}, c = {c}, d = {d}, kw = {kw}')# 调用方式print(f2(1, 2, d=1)) # a = 1, b = 2, c = 0, d = 1, kw = {}print(f2(1, 2, d=99, ext=None)) # a = 1, b = 2, c = 0, d = 99, kw = {'ext': None}
递归函数
递归函数通过调用自身实现功能。常见的递归函数是阶乘函数。例如:
def fact(n): if n == 1: return 1 return n * fact(n - 1)# 调用方式print(fact(5)) # 输出 120
递归函数可能导致栈溢出,建议使用尾递归优化。例如:
def fact_iter(num, product): if num == 1: return product return fact_iter(num - 1, num * product)def fact(n): return fact_iter(n, 1)
尾递归优化可以避免栈溢出问题。例如:
def fact(n): return fact_iter(n, 1)def fact_iter(num, product): if num == 1: return product return fact_iter(num - 1, num * product)
常见问题
默认参数的陷阱
默认参数不能指向可变对象,否则会导致所有调用共享同一个对象。正确做法是使用不变对象或None
。 可变参数的处理
可变参数接收的是一个元组,函数内部需要遍历元组中的元素。命名关键字参数的使用
命名关键字参数需要放在*
后面,或者在可变参数之后。 递归函数的优化
尾递归优化可以提高递归函数的性能,避免栈溢出。总结
通过合理使用函数的参数类型和调用方式,可以编写更灵活且高效的代码。函数是编程的核心,掌握了函数的使用和定义,才能更好地开发程序。
发表评论
最新留言
关注你微信了!
[***.104.42.241]2025年04月12日 06时46分31秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
上周热点回顾(6.16-6.22)
2019-03-06
上周热点回顾(10.20-10.26)
2019-03-06
上周热点回顾(2.16-2.22)
2019-03-06
上周热点回顾(3.2-3.8)
2019-03-06
.NET跨平台之旅:借助ASP.NET 5 Beta5的新特性显示CLR与操作系统信息
2019-03-06
上周热点回顾(7.27-8.2)
2019-03-06
上周热点回顾(9.28-10.4)
2019-03-06
上周热点回顾(5.2-5.8)
2019-03-06
上周热点回顾(5.9-5.15)
2019-03-06
上周热点回顾(8.8-8.14)
2019-03-06
.NET跨平台之旅:将示例站点升级至 .NET Core 1.1 Preview 1
2019-03-06
上周热点回顾(1.16-1.22)
2019-03-06
上周热点回顾(1.23-1.29)
2019-03-06
上周热点回顾(3.20-3.26)
2019-03-06
上周热点回顾(4.24-4.30)
2019-03-06
[故障公告]博客站点1台负载均衡遭遇流量攻击,造成联通与移动用户无法正常访问
2019-03-06
上周热点回顾(5.1-5.7)
2019-03-06
上周热点回顾(6.19-6.25)
2019-03-06
云计算之路-阿里云上:docker swarm 集群故障与异常
2019-03-06