Python学习(六)
发布日期:2021-05-07 06:37:10 浏览次数:23 分类:精选文章

本文共 3262 字,大约阅读时间需要 10 分钟。

Python 函数入门

调用函数

你可以通过help()函数查看某个函数的帮助信息。例如:

help(abs)

调用函数时,可以通过函数名直接执行。例如:

print(abs(-10))  # 输出 10
print(max(1, 2, 10)) # 输出 10

你也可以将函数赋值给变量,方便重命名或调用。例如:

a = abs
print(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)) # 输出 5
print(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')) # 会抛出TypeError
except TypeError as e:
print(e)

(3)返回多个值

函数可以返回多个值,使用元组形式表示。例如:

import math
def 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 = 1
print(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)) # 输出 100
print(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

  • 可变参数的处理

    可变参数接收的是一个元组,函数内部需要遍历元组中的元素。

  • 命名关键字参数的使用

    命名关键字参数需要放在*后面,或者在可变参数之后。

  • 递归函数的优化

    尾递归优化可以提高递归函数的性能,避免栈溢出。

  • 总结

    通过合理使用函数的参数类型和调用方式,可以编写更灵活且高效的代码。函数是编程的核心,掌握了函数的使用和定义,才能更好地开发程序。

    上一篇:python-问题解决
    下一篇:Python学习-基础(五)

    发表评论

    最新留言

    关注你微信了!
    [***.104.42.241]2025年04月12日 06时46分31秒