Python函数的介绍 函数的闭包、filter类、map类、内置函数总结

函数基础

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 用来求和的

注意

函数不可重名,重名后一个函数会覆盖前一个函数





如有帮助,可留下你们宝贵的赞吗
如有错误,欢迎提出
感谢

猜你喜欢

转载自blog.csdn.net/hmh4640219/article/details/112197950
今日推荐