在有Java基础上学Python(下)

函数

Python也有关于函数的概念,官方文档可以查看一些官方函数,也可以在命令行通过help(函数名),查看函数的帮助信息

求绝对值的函数abs
>>> abs(100)
100
>>> abs(-20)
20
>>> abs(12.34)
12.34

注意调用函数的时候,如果传入的参数数量不对,会报TypeError错误,并且会提示

>>> abs(1, 2)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: abs() takes exactly one argument (2 given)

也可以自己定义函数,在python中,定义函数要使用def语句,依次写出函数名,括号,括号中的参数和冒号:,然后,在缩进块中编写函数体,函数的返回值用return语句返回

def my_abs(x):
    if x >= 0:
        return x
    else:
        return -x

print(my_abs(-99))

空函数
def nop():
    pass

isinstance()函数可以对参数类型做检查,只允许整数和浮点型类型的参数
def my_abs(x):
    if not isinstance(x, (int, float)):
        raise TypeError('bad operand type')
    if x >= 0:
        return x
    else:
        return -x
如果添加了参数检查之后,如果传入错误的参数类型,函数就会抛出一个异常
>>> my_abs('A')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 3, in my_abs
TypeError: bad operand type

注意使用递归函数的优点是定义简单,逻辑清晰,理论上,所有的递归函数都可以写成循环的方式,但循环的逻辑不如递归清晰,所以注意防止栈溢出,在计算机中,函数调用是通过栈这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出。

而解决递归调用栈溢出的方法是通过尾递归优化,实际上尾递归和循环的效果是一样的,所以,把循环看成是一种特殊的尾递归函数。尾递归,是指在函数返回时,调用自身本身,而且,return语句不能包含表达式,这样编译器或者解释器就可以把尾递归做优化,使递归本身无论调用多少次,都只占用一个栈帧,不会出现栈溢出的情况。

map/reduce

map()函数接收两个参数,一个是函数,一个是Iterable,map将传入的函数依次作用到序列的每个元素,并把结果作为新的Iterator返回

def f(x):
return x

>>> r = map(f, [1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> list(r)
[1, 2, 3, 4, 5, 6, 7, 8, 9]

reduce是将一个函数作用在一个序列上,这个函数必须接收两个函数,reduce把结果和序列的下一个元素做积累计算,其效果就是

reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)

B比如说一个序列求和,就可以用reduce实现

>>> from functools import reduce
>>> def add(x, y):
...     return x + y
...
>>> reduce(add, [1, 3, 5, 7, 9])
25

filter

filter函数入参接收一个函数和一个序列,根据返回值是true还是false,决定来保留还是丢弃该元素
在list中,删掉偶数,只保留奇数

def is_odd(n):
    return n % 2 == 1

list(filter(is_odd, [1, 2, 4, 5, 6, 9, 10, 15]))
# 结果: [1, 5, 9, 15]

后面关于io以及线程,内容基本一样,不做过多深入

posted @ 2026-03-22 20:35  奕帆卷卷  阅读(2)  评论(0)    收藏  举报