一、函数的定义
def test(x)
"The Function definitions"
x +=
return x
def:定义函数的关键字
test:函数名
():定义形参
“”:文档描述
x += 1:泛指代码块或程序处理逻辑
return:定义返回值(出现return,函数结束)
调用运行时,可带参数也可不带:函数()
优点:代码重用,保持一致性易维护,可扩展性
二、函数和过程
1.过程即没有返回值的函数,由于Python中没有使用return返回值时,会返回None,所以过程在Python中也是函数
2.返回值
def test01():
pass
def test02():
return 0
def test03():
return 0, 10, 'hello', ['kobe', 'lbj'], {'Team': 'lakers'}
t1 = test01()
t2 = test02()
t3 = test03()
print(t1,t2,t3)
返回值数为0,返回None,返回值数为1,返回object,返回值数>1,返回tuple。
三、函数参数
1.形参和实参
def calc(x,y):#x,y为形参
res = x ** y
return res
t = calc(1,2)#1,2为实参
print(t)
形参只在函数调用时才分配内存单元,调用结束后立即释放,因此形参只在函数内部有效
实参可以是常量、变量、表达式、函数,在函数调用时,实在必须有确定的值以便把值传给形参
2.位置参数和关键字参数
def test(x,y,z):
print(x,y,z)
test(1,2,3)#位置参数
test(x=1,z=3,y=2)#关键字参数
test(1,y=2,z=3)
位置参数必须一一对应,不能多或少,关键字参数无须一一对应,也不能多或少,二者可以混用,但位置参数必须在关键字参数左边否则报错。
3.默认参数
def power(x, n=2):#n为默认参数
s = 1
while n > 0:
n = n - 1
s = s * x
print(s)
return(s) power(4,4)
默认参数可以降低函数调用的难度,但设置的时候要注意,不能用可变对象
def add_end(L=[]):
L.append('END')
return L # print(add_end([123,456]))
print(add_end())
print(add_end())
print(add_end())
4.参数组
def test(x,*args,**kwargs):
print(x)
print(args)
print(kwargs)
test(1,2,3,4,5,y=12,z=22)
*args传的是列表或元组,**kwargs传的是字典
(1)定义可变参数用*
def calc(*numbers):
sum = 0
for n in numbers:
sum = sum + n * n
return sum
s = calc(1,2,3)
print(s)
num = [1,2,3,4]
s = calc(*num)
print(s)
(2)定义关键字参数用**
def person(name, age, **kw):
print("name:", name, "age:", age, "other:", kw)
person("hechouzi", 25,city="jiangsu",height=183)
extra = {"city":"jiangsu","height":183}
person("heheh",12,**extra)
四、全局变量和局部变量
全局变量全部大写,局部变量全部小写
函数中如果没有global参数,且没有声明局部变量,函数内部可以调用全局变量,但不可修改
函数中如果有global参数,可以对全局变量进行修改
函数中如果定义了局部变量,则优先读取局部变量
NAME = "KOBE"
def change_name():
global NAME
name = "LBJ"
print("Who am i:",NAME)
print("Who are you:",name)
NAME = "BYRANT"
print("Now,who am i:",NAME)
print("Now,who are you:",name)
change_name()
print(NAME)
print(name)#报错,因为是局部变量
五、前向引用
“函数即变量”
def test1():
print("from test1")
test2()
def test2():
print("from test2")
test1()
前向引用就是在定义函数之前引用
六、嵌套函数和作用域
def test1():
name = "Jordan" def test2():
name = "Kobe" def test3(): print(name)
return test3 return test2
func = test1
print(func)
func()()()
七、递归调用
1.递归特性
1.必须有一个明确的结束条件;2.进入深一层的递归,问题规模要比上一层有所减少;3.递归效率不高,递归层次过高会导致栈溢出。
(图侵删)
def calc(n):
if int(n/2)==0:
return n
n = int(n/2)
re = calc(n)
return re
print(calc(100))
2.尾递归优化
如阶乘函数,当所求阶乘数太大,会导致栈溢出。
def fact(n):
if n == 1:
return n
return n*fact(n-1)
print(fact(100))
尾调用就是指在一个函数的最后一步调用另外一个函数,以此来实现尾递归优化
def fact(n):
return fact_iter(n,1);
def fact_iter(num,res):
if num == 1:
return res
return fact_iter(num - 1,num*res)
print(fact(5))
尾调用优化可以不要保存外层函数的调用记录,可以防止栈溢出,但大多数编程语言没有针对尾调用优化,Python也没有。
八、匿名函数
calc = lambda n:n**n
print(calc(10))
匿名函数lambda主要和其他函数搭配使用
九、函数式编程
1.函数式编程
函数式编程就是一种抽象程度很高的编程范式,纯粹的函数式编程语言编写的函数没有变量,因此,任意一个函数,只要输入是确定的,输出就是确定的,这种纯函数我们称之为没有副作用。而允许使用变量的程序设计语言,由于函数内部的变量状态不确定,同样的输入,可能得到不同的输出,因此,这种函数是有副作用的。
函数式编程的一个特点是允许把函数本身作为参数传给另一个函数,还允许返回一个函数,因为Python允许使用变量,所以Python不是纯函数式编程语言。
2.高阶函数
可以接收另外一个函数做变量的函数
def add(x,y,f):
return (f(x)+f(y))
print(add(-1,6,abs))
高阶函数满足两个特性:(1)传入参数是一个函数名;(2)返回值是一个函数名
3.map函数和reduce函数
(1)map函数
接收两个参数,一个是函数,一个是可迭代对象
def f(x):
return x*x
print(list(map(f,[1,2,3,4,5])))
L = []
for i in [1,2,3,4,5]:
L.append(i*i)
print(L)
相同功能可以用for实现,但map函数把运算规则抽象了,可以计算任意复杂函数。
map函数结合匿名函数的使用
print(list(map(lambda x:x*x,range(5))))
(2)reduce函数
把一个函数作用到一个序列[x1,x2,x3,...]上,这个函数必须接收两个参数,reduce把结果继续和序列的下一个元素做累积运算。
from functools import reduce
def f(x,y):
return x*100+y*10
print(reduce(f,[1,2,3,4,5]))
4.filter函数
与map函数类似,filter函数也要接收一个函数和一个序列,filter函数把传入的函数依次作用于每一个元素,然后根据返回值是True和False来决定保留还是丢弃。
def is_odd(x):
return x % 2 == 1
print(list(filter(is_odd,[1,2,3,4,5,6,7,8])))
十、内置函数
https://docs.python.org/3/library/functions.html?highlight=built#ascii
1.abs()
取绝对值
2.all()
把所有元素做bool运算,如果都是True则返回True
3.any()
把所有元素做bool运算,只要有一个是True就返回True
4.bin()/hex()/oct()
把十进制数转换成二进制/十六进制/八进制数
5.bool()
判断bool值
6.bytes()
把字符串转换成字节,需指定编码
#bytes()函数
a = bytes('abc', 'utf-8')
print(a)
b = bytes(1)
print(b)
c = bytes([2,3,6,8])
print(c)
7.chr()/ord()
chr(),输入ASCII码表中的编号,输出对应字符;ord(),输入字符,显示字符对应的ASCII码表中的编号
8.dir()
打印某个对象下的方法
9.divmod()
取得商和余数,可以用在分页功能
10.enumerate()
遍历序列中的元素及下标
test = [11,22,33,44]
for i,j in enumerate(test):
print(i,j)
11.eval()
将字符串str当成有效的表达式来求值并返回计算结果;把字符串中的数据结构提取出来
12.zip()
拉链
a = (1,2,3)
b = ("a","b","c")
print(list(zip(a,b))
13.max()/min()
求取最大值和最小值
14.pow()
输入两个参数是求取次幂,输入三个参数是求次幂后取余
15.reversed()
反转
16.round()
四舍五入 ,可以指定小数位
17.sorted()
排序
18.sum()
求和
19.type()
查看类型
20.__import__()
导入文件