函数编程

函数编程

bytes类型

  • s = b”Hello World”
  • “小猿圈”.encode(“utf-8”)

深浅copy

  • d2 = data.copy() #浅copy
  • import copy #深copy
    d3 = copy.deepcopy(data)

编码转换

  • s.encode(“utf-8”) #编码成为bytes类型
  • b’\xe5\xb0\x8f\xe7\x8c\xbf\xe5\x9c\x88’.decode(“utf-8”) #解码

函数

  • def register(name,age,major,country) : #三个引号填写函数注释
    “”"
    学籍注册程序
    :param name:str,Eg:Alex
    :param age:int,Eg:20
    :param major:str,Eg:Chinese
    :param country:str,Eg:USA
    :return:
    “”"
  • 形参、实参
    在这里插入图片描述
  • 默认参数
    def stu_register(name,age,course,country=“CN”):
  • 关键参数
    stu_register(“王山炮”,course=‘PY’, age=22,country=‘JP’ )
  • 非固定参数
    def stu_register(name,age,*args): # *args 会把多传入的参数变成一个元组形式
    def stu_register(name,age,*args,**kwargs): # *kwargs 会把多传入的关键参数变成一个dict形式

函数返回值与作用域

  • 函数返回值
    def return_more(name,age) :
    return name,age #以元组的形式返回
    print(return_more(“alex”,22))
    #结果:
    (‘alex’, 22)
  • 函数作用域
    即有效范围,global name声明全局变量

嵌套&匿名&高阶函数

  • 嵌套函数
    def f1():
     def f2():
     print(“Hello”)
     f2()
    f1()
  • 匿名函数
    res = map(lambda x:x**2,[1,5,7,4,8]) #map和filter函数需要for循环输出结果
  • def add(x,y,f): #插入一个函数作为参数
    return f(x) + f(y) #用插入的函数来计算前两个参数并且返回计算后的值

函数的递归

  • 函数递归
    def calc(n):
     n = int(n/2)
     print(n)
     if n > 0:
    calc(n) #递归函数就是不断地调用自己

内置函数

  • abs # 求绝对值abs(-1)
  • bytes#将字符转成二进制,bytes(“中国”,”gbk”)等同于”中国”.encode(“gbk”)
  • enumerate #返回列表的索引和元素,比如 d = [“alex”,”jack”],enumerate(d)后,得到(0, ‘alex’) (1, ‘jack’)
  • eval #可以把字符串形式的list,dict,set,tuple,再转换成其原有的数据类型,eval("[1,2,3]")
  • exec #把字符串格式的代码,进行解义并执行,exec(“print(‘hellworld’)”)
  • filter #对list、dict、set、tuple等可迭代对象进行过滤, filter(lambda x:x>10,[0,1,23,3,4,4,5,6,67,7])过滤出所有大于10的值
  • isinstance #判断一个数据结构的类型,isinstance(“abc”,str)
  • sorted(iterable, cmp=None, key=None, reverse=False)
    sorted(data_device.items(), key= lambda item:item[1], reverse= True)
  • zip #(像拉链)可以把2个或多个列表拼成一个
    a=[1, 4, 9, 1849, 2025, 25, 36],b = [“a”,”b”,”c”,”d”]
    list(zip(a,b)) #得结果 [(1, ‘a’), (4, ‘b’), (9, ‘c’), (1849, ‘d’)]

名称空间

  • locals:函数内部的名字空间
  • enclosing function:(最近的)
  • globals
  • builtins内置模块空间

闭包现象

  • def outer() :
     name = “Alex”
     def inner() :
       print(name)
     return inner  #这里只是返回inner的函数名称(也是内存地址)
    fun = outer()   #这里fun就等于inner,也指向inner的内存地址
    fun()   #这里相当于inner(),将inner函数执行了

装饰器

account = {
    "is_authenticated":False,# 用户登录了就把这个改成True
    "username":"alex", # 假装这是DB里存的用户信息
    "password":"abc123" # 假装这是DB里存的用户信息
}
def login(func):	#这里要插入一个函数
    def inner(): # 再定义一层函数
        if account["is_authenticated"] is False:
            username = input("user:")
            password = input("pasword:")
            if username == account["username"] and password == account["password"]:
                print("welcome login....")
                account["is_authenticated"] = True
            else:
                print("wrong username or password!")
        if account["is_authenticated"] is True:
            func()
    return inner  # 注意这里只返回inner的内存地址,不执行
def home():
    print("---首页----")
def america():
    print("----欧美专区----")
def japan():
    print("----日韩专区----")
def henan():
    print("----河南专区----")
home()
america = login(america) # 这次执行login返回的是inner的内存地址 .inner at 0x101762840>
henan = login(henan)  # .inner at 0x102562840>
america()  # 相当于执行inner()
henan()

列表生成式

  • 列表生成式
    a = [i+1 for i in range(10)] #for前面是输出结果,后面是循环
  • 集合生成式
d = {"salary":100,"age":20}
d = {k:v+1 for k,v in d.items()}
print(d)
{'salary': 101, 'age': 21}
dict0 = {"英语":66, "数学":78, "政治":42, "语文":59}
    #去除掉字典中value < 60的数据
dict1 = {k:v for k, v in dict0.items() if v >= 60}
print(dict1)
{'英语': 66, '数学': 78}

生成器generator

一边循环一边计算后面元素的机制,称为生成器,保存算法,一步步推导,不用事先循环出所有数据

  • 列表生成式改为生成器,直接将[]改为()
>>> [x * x for x in range(10)]
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
>>> (x * x for x in range(10))	#只是保存了算法,并没有实际执行
 at 0x101ebc3b8>
(x*x for x in range(10))生成的就是一个生成器
g = (x * x for x in range(10))
next(g)	#next函数导出,也可以用for循环导出数据
  • 函数生成器
    斐波那契函数
def fib(max):
    a,b = 0,1
    n = 0  # 斐波那契数
    while n < max:
        n = a + b
        a = b # 把b的旧值给到a
        b = n # 新的b = a + b(旧b的值)
        #print(n)
        yield n		 #类似return,但是return会结束程序,yield只会暂停并且返回当前值,使用next()语法就继续下一步
f = fib(100) 		# 注意这句调用时,函数并不会执行,只有下一次调用next时,函数才会真正执行,必须用f替代fib()函数,否则next()每次调用只会返回函数头开始执行,永远不会执行yield以后的部分
print(f)
print(f.__next__())
print(f.__next__())
print(f.__next__())
print(f.__next__())
输出
1
2
3
5
  • 并发编程
    从外部给生成器内输入值
def g_test() :
    while True :
        n = yield
        print("recieve",n)
g = g_test()
next(g)	#生成器的第一个输入必须为空值None,在输入前必须调用一次生成器到yield等候下次next命令,next(g)就是第一次调用并且返回None输入给yield
for i in range(3):
    g.send(i)
输出结果:
recieve 0
recieve 1
recieve 2

迭代器

可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值