函数基础
1.函数理解
函数就是一堆准备好的代码,在需要的时候调用这堆代码
2.函数定义
def 函数名(形参):
函数体
3.函数返回值
return和yield用来返回,如果没有返回值,默认的返回值是None
return:返回的是什么就是什么,一般情况下一个函数就执行一个return,重点掌握
yield:返回的是一个generator对象,这个就学习爬虫框架的时候用的多
generator的调用方式:
1、使用next();
2、使用for…in循环
4.函数调用
函数名(实参)
好先演示一个最基本函数定义与调用:
def make_love(a,b):
print(f'{a}和{b}陷入了爱河')
make_love('小明','小花')# '小明和小花陷入了爱河'
# 这是没有返回值的,用一个变量去接它,再打印显示的是None
b = make_love(1,2)# 注意赋值的时候,函数就调用了,所以会打印'1和2陷入了爱河'
# 而打印b时就只会打印返回值
print(b) # None
# 要是上面的不好理解,就看这个
def mysum(a,b):
print(a+22)
return a+b
s = mysum(1,2) # 23
print(s)# 3
5.局部变量和全局变量
全局变量:可以这么理解,在函数外定义的变量,在整个py文件都可以访问;
局部变量:函数内定义的变量,只能在函数内使用;
注意:如果局部变量和全局变量同名,会在函数内部定义一个新的局部变量,而不是修改全局变量;
函数内部如果想要修改全局变量,使用global对变量进行声明,可以通过函数修改全局变量的值;
内置函数 globals() ,locals()可以查看全局变量和局部变量
a = 100
word = '你好
def test():
x = 'hello'
print('x = {}'.format(x))
a = 10
print('函数内部a = {}'.format(a))
global word
word = 'ok'
test()# x = hello
# 函数内部a = 10
# 打印函数内定义的变量,会报错
# print(x) # NameError: name 'x' is not defined
print('函数外部a = {}'.format(a))# 函数外部a = 100 这里a的值没有改变
print('函数外部word = {}'.format(word))# 函数外部word = ok 这里word的值改变了
# print('locals={},globals={}'.format(locals(), globals()))
6.默认参数的使用
def say_hello(a, b, c='湖南'):
print('我叫{},我今年{}岁,我来自{}'.format(a, b, c))
say_hello('张三', 18) # 没有传递参数,就使用默认值湖南
say_hello('张三', 18, '湖北') # 传递了参数,就使用传递的实参
7.可变参数
*args表示可变位置参数,没=的就是位置参数 ;**kwargs表示可变的关键字参数,有=的就是关键字参数;args和kwargs可换成其他变量名,但是建议别换,代码的规范
调用函数传递参数时:
多出来的位置参数会以元组的形式保存到args里面;
多出来的关键字参数会以字典的形式保存到kwargs里面;
def my_add(a, b, *args, **kwargs):
print('a={},b={},c={},kwargs={}'.format(a, b, args, kwargs))
c = a + b
for arg in args:
c += arg
return c
x = my_add(1, 2, x=1)# a=1,b=2,c=(),kwargs={'x': 1}
print(x)# 3
y = my_add(1, 3, 2, x=1, y=2)# a=1,b=3,c=(2,),kwargs={'x': 1, 'y': 2}
print(y)# 6
z = my_add(2, 2, 3, 4) # a=2,b=2,c=(3, 4),kwargs={}
print(z)# 11
8.匿名函数的使用
除了使用关键字def定义一个函数,我们还可以使用lambda 表达式定义函数:
用来表达一个简单的函数,函数调用的次数很少,基本上只调用一次
调用匿名函数的两种方法:
1、给他定义一个名字(用的很少)
2、把这个函数当做参数传给另一个函数(使用场景比较多)
在对字典列表进行排序的时候我就用到了
1.filter类
filter 是对可迭代对象进行过滤,得到的是一个filter对象;
Python2的时候是内置函数,Python3修改成了内置类;
filter可以给定两个参数,第一个参数是函数,第二个参数是可迭代对象;
fliter结果是一个filter类型的对象,filter对象也是一个可迭代对象;
ages = [21, 12, 35, 14, 24, 26]
x = filter(lambda age: age > 18, ages)
print(x) # <filter object at 0x0000000001DC8AC8>
print(list(x))# [21, 35, 24, 26]
for i in x:
print(i,end=' ')# 21 35 24 26
print()# 用来换下行
adults = list(x)
print(adults)# []
print(list(filter(lambda x:x%2,range(10))))# [1, 3, 5, 7, 9]
2.map类
map的作用就是让可迭代对象里面的数据都进行一边函数里的操作
得到的是一个map对象,同样能对map对象进行迭代,迭代完之后,map对象就为空了
ages = [12, 30, 11, 21, 14, 15]
x = map(lambda age: age * 2, ages)
print(x)# <map object at 0x00000000005B2400>
print(list(x))# [24, 60, 22, 42, 28, 30]
for i in x:
print(i)
print(list(x))# []
9.函数嵌套(用的少,作为了解)
闭包:如果在一个内部函数里,对在外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就被认为是闭包
def outer():
m = 10
def inner():
nonlocal m # 用这个可以一修改外部局部变量
m += 1
print(m)
return inner
f = outer()
f()# 11
# 这个f就相当于是inner函数,在调用inner的时候,
# m相对于inner函数就是一个全局变量是不会被释放的
# 注意是相对的,你在外面直接打印m也是不行的
# 用处就是防止m被外部污染(以防被改变)
f()# 12
f()# 13
f()# 14
#但如果你是直接使用外部函数调用内部函数,m用完就释放了
outer()()# 11
outer()()# 11
outer()()# 11
10.装饰器的使用
import time
def cal_time(fn):
print('fn={}'.format(fn))
def inner():
start=time.time()
fn()
end=time.time()
print(end - start)
return inner
@cal_time # 第一件事是调用cal_time;第二件事是把被装饰的函数传递给fn
def jjj():
x = 0
for i in range(1, 100000000):
x += i
print(x)
# 第三件事:当再次调用jjj函数时,现在的jjj函数已经不再是上面的jjj函数,而是上面的内部函数inner
# print(jjj)
jjj()
# fn=<function jjj at 0x00000261AEEC0708>
# 4999999950000000
# 5.602903842926025
def factor(fn):
def inner(x,y,*args,**kwargs):
a=kwargs.get('clock',23)
if a<23:
fn(x,y)
else:
print('太晚了睡觉吧')
return inner
@factor
def play_game(name,game):
print('{}正在玩{}'.format(name,game))
# 注意这里给play_game函数传参的时候其实是给inner函数传参
play_game('张三','王者荣耀',d=12,c=13)
play_game('张三','王者荣耀',d=12,c=13,clock=21)
内置函数总结
不全,但是先掌握这么多吧
函数名 | 作用 |
---|---|
all | 将所有的元素转换为布尔值,只有所以都是True,才是True,否者就是False |
any | 将所有的元素转换为布尔值,有一个是True就是True,所有是False才是False |
bin | 将数字转换成二进制 |
oct | 将数字转换成为八进制 |
hex | 将数字转换成为十六进制 |
chr | 将字符编码转换成对应的字符 |
ord | 将对应的字符转换成字符编码 |
dir | 可以列出对象所有属性和方法 |
divmod | 求两个数相除的商和余数 |
eval | 执行字符串里的python代码 |
exit | 以指定的退出码结束程序 |
globals | 用来查看所有的全局变量 |
locals | 用来查看所有的局部变量 |
help | 用来查看帮助文档的 |
id | 获取一个数据的内存地址 |
isinstance | 判断一个对象是否由一个类创建出来的 |
issubclass | 判断一个类是否是另一个类的子类 |
len | 获取长度 |
iter | 获取可迭代对象的迭代器 |
next | for…in循环本质上就是调用迭代器的next方法 |
max | 求最大数 |
min | 求最小数 |
open | 用来打开一个文件 |
pow | 求一个数的n次方 |
round | 四舍五入保留到指定小数位 |
sum | 用来求和的 |
注意
函数不可重名,重名后一个函数会覆盖前一个函数