目录
1、关于函数
1.1 定义
你可以定义一个由自己想要功能的函数,以下是简单的规则:
- 函数代码块以 def 关键词开头,后接函数标识符名称和圆括号()。
- 任何传入参数和自变量必须放在圆括号中间。圆括号之间可以用于定义参数。
- 函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明。
- 函数内容以冒号起始,并且缩进。
- return [表达式] 结束函数,选择性地返回一个值给调用方。不带表达式的return相当于返回 None。
1.2 语法
def functionname( parameters ):
"函数_文档字符串"
function_suite
return [expression]
1.3 参数
形参:函数定义时的参数名。
实参:函数调用时的实际值。
可变长形参之*
形参中的*会将溢出的位置实参全部接受,然后以元组的形式存储,然后把元组赋值给*后的参数,需要注意的是*后的参数名约定成俗成为args。
可变长实参之*
实参中的*会将*后参数的值循环取出,打散成位置实参,以后但凡碰到实参中带有*的,就是位置实参,应该马上进行打散成位置实参去看。
可变长形参之**
形参中的**会将溢出的关键字实参全部接收,然后存储字典的形式,然后把字典赋值给**后的参数,需要注意的是**后的参数名约定成俗为kwargs。
可变长形参之**
形参中的**会将溢出的关键字实参全部接收,然后存储字典的形式,然后把字典赋值给**后的参数,需要注意的是**后的参数名约定成俗为kwargs。
1.4 函数的return
退出函数,并且返回结果,可以有多个return,一旦执行到return就退出不会执行后面的语句了,函数也可以没有return,或者return后面不接返回值,默认返回值都是None,return后面也可以接多个返回值。
2、内建函数
python的内建函数即是python自带的函数,这种函数不需要定义,并且不同的内建函数具有不同的功能,可以直接使用。
abs() | 返回数的绝对值 |
all() | 如果可迭代对象中的所有项均为 true,则返回 True。 |
any() | 如果可迭代对象中的任何项为 true,则返回 True。 |
bin() | 返回数的二进制版本。 |
bool() | 返回指定对象的布尔值。 |
bytes() | 返回字节对象。 |
compile() | 把指定的源作为对象返回,准备执行。 |
complex() | 返回复数。 |
dict() | 返回字典(数组)。 |
dir() | 返回指定对象的属性和方法的列表。 |
eval() | 评估并执行表达式。 |
filter() | 使用过滤器函数排除可迭代对象中的项目。 |
float() | 返回浮点数。 |
format() | 格式化指定值。 |
frozenset() | 返回 frozenset 对象。 |
getattr() | 返回指定属性的值(属性或方法)。 |
help() | 执行内建的帮助系统。 |
hex() | 把数字转换为十六进制值。 |
id() | 返回对象的 id。 |
input() | 允许用户输入。 |
int() | 返回整数。 |
isinstance() | 如果指定的对象是指定对象的实例,则返回 True。 |
issubclass() | 如果指定的类是指定对象的子类,则返回 True。 |
iter() | 返回迭代器对象。 |
len() | 返回对象的长度。 |
list() | 返回列表。 |
map() | 返回指定的迭代器,其中指定的函数应用于每个项目。 |
next() | 返回可迭代对象中的下一项。 |
object() | 返回新对象。 |
oct() | 把数转换为八进制。 |
open() | 打开文件并返回文件对象。 |
ord() | 转换表示指定字符的 Unicode 的整数。 |
pow() | 返回 x 的 y 次幂的值。 |
print() | 打印标准输出设备。 |
range() | 返回数字序列,从 0 开始且以 1 为增量(默认地)。 |
reversed() | 返回反转的迭代器。 |
round() | 对数进行舍入。 |
set() | 返回新的集合对象。 |
slice() | 返回 slice 对象。 |
type() | 返回对象的类型。 |
具体请参考:
3、匿名函数
3.1 定义
python 使用 lambda 来创建匿名函数。
- lambda只是一个表达式,函数体比def简单很多。
- lambda的主体是一个表达式,而不是一个代码块。仅仅能在lambda表达式中封装有限的逻辑进去。
- lambda函数拥有自己的命名空间,且不能访问自有参数列表之外或全局命名空间里的参数。
- 虽然lambda函数看起来只能写一行,却不等同于C或C++的内联函数,后者的目的是调用小函数时不占用栈内存从而增加运行效率。
3.2 语法
lambda [arg1 [,arg2,.....argn]]:expression
3.3 举例
例1:
def s(x):
if x==1:
return "yes"
else:
return "no"
print(s(0))
print(s(1))
匿名函数:
s=lambda x:"yes" if x==1 else "no"
print(s(0))
print(s(1))
输出:
no
yes
no
yes
例2:
def sum(x,y):
return x+y
print(sum(1,2))
匿名函数:
sum = lambda x,y : x+y
print(sum(1,2))
输出:
3
3
print(list(map(lambda x,y:x+y, lst, lst2)))
#x,y为需要接收的参数,x+y为要得到什么结果对参数进行什么处理
4、递归函数
4.1 定义
函数在运行的过程中,直接和间接调用了自身,就是递归函数。
4.2 特性
- 必须有一个结束的条件
- 每一次递归都必须离“结果”更近一步
- 通常前一次的输出作为后一次的输入
- 如果没有结束的条件或者递归次数过多会导致内存溢出
4.3 举例
1.斐波拉契数列
现在有数列,[1,1,2,3,5,8,13,......,n],请问第7位数是什么?请编写一个函数。
def fact(a):
if a <= 2:
return 1
return fact(a - 1) + fact(a - 2)
print(fact(7))
上述前一个数和有一个数之间有关联:f(n) = f(n-1) + f(n-2)。使用递归函数需要注意防止栈溢出。
2.走楼梯问题
每次走楼梯可以选择走一个台阶,或者两个台阶,走到n阶台阶共有多少个走法?
到第10阶的方式第可上一阶可上二阶,到达第8阶的方式+到达第九阶的方式就为到达第10阶的共有的方式。
def func1(n):
if n == 1 or n == 2:
return n
else:
return func1(n-1)+func1(n-2)
print(func1(10))
有一对雌雄兔每两个月繁殖一对雌雄兔,第n每月有多少对?
def func1(n):
if n<= 2:
return 1
return func1(n - 2)*2
print(func1(6))
参考文章:Python 函数 | 菜鸟教程 (runoob.com)
5、高阶函数
5.1 定义
把函数作为参数传入,这样的函数称为高阶函数。
5.2 map
内置函数map,map()函数接收两个参数,一个是函数,一个是Iterable(可多个),
• map将传入的函数依次作用到序列的每个元素,并把结果作为新的Iterator返回。
# map函数:求list[1-10]各项的平方
def f2(m):
return m * m
print(list(map(f2, range(1,11))))
输出:
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
5.3 filter
filter()把传入的函数依次作用于每个元素,然后根据返回值是True保留,还是False丢弃该元素。
#filter函数:找出[1-100]能被3整除的数
def f(n):
return n % 3 == 0
print(list(filter(f, range(0,101))))
输出:
[0, 3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39, 42, 45, 48, 51, 54, 57, 60, 63, 66, 69, 72, 75, 78, 81, 84, 87, 90, 93, 96, 99]
5.4 reduce
用Python-reduce代码实现:将列表[1,3,5,7,9],变成整数13579
• reduce把一个函数作用在一个序列[x1, x2, x3, ...]上
• 这个函数必须接收两个参数
• reduce把结果继续和序列的下一个元素做累积计算
• reduce(f, [x1, x2, x3, x4]) => f(f(f(x1, x2), x
from functools import reduce
def f(x, y):
return x * 10 + y
print(reduce(f, [1, 3, 5, 7, 9])) 运行结果13579
# 将列表[1,4,5,9]转换成'1459'的字符串
from functools import reduce
def f3(b, a):
return b * 10 + a
print(reduce(f3,[1,4,5,9]))
输出:
1459
5.5 sorted
用Python-sorted代码实现:按绝对值大小排序,sorted()函数也是一个高阶函数,它还可以接收一个key函数来实现自定义的排序,key指定的函数将作用于list的每一个元素上,并根据key函数返回的结果进行排序。
对比原始的list和经过key=abs处理过的list:
• 执行语句:sorted([36, 5, -12, 9, -21], key=abs)
list1 = [7,-8,5,4,0,-2,-5]
print(sorted(list1,key=lambda x:(x<=0, abs(x))))
输出:
[4, 5, 7, 0, -2, -5, -8]