Python之路【第3天】

目录

  1. 迭代器
  2. 生成器generator
  3. 装饰器
  4. 单线程实现并发运算
  5. 递归
  6. 打印一个二维数组
  7. 斐波那契数列

迭代器

  1. 从第一个元素开始访问
  2. 只能往前不能后退
  3. 不需要准备整个文件
  4. 便于遍历几个G的文件
names=iter(["aa","bb","cc"])  #创建一个迭代器
print(names)
print(names.__next__())
print(names.__next__())
print(names.__next__())
#结果为:
<list_iterator object at 0x00000238C543DDD8>
aa
bb
cc
#ps:每次只能取一个数

生成器generator

一个函数调用时返回一个迭代器

取钱案例

def cash_money(amount):
    while amount>0:
        amount-=100
        yield 100   #返回值和接受值
        print("又来取钱了!")

atm=cash_money(300)  #调用函数
print(type(atm))  #查看函数类型
print(atm.__next__())  #打印结果
print(atm.__next__())
print("中断做其他事")   #迭代器异步操作,其他的函数不能中断,中断了不能继续执行
print(atm.__next__())
#结果为:
<class 'generator'>
100
又来取钱了!
100
中断做其他事
又来取钱了!
100

装饰器

# 单独print(login)是打印出login的地址
def login(func):    #这里func=f1 是一个参数地址
    def inner():   #再定义一个函数
        #验证
       print("验证了")
       return func()  #这里相当于 f1()
    return inner()
@login       #装饰器
def f1():
    print("f1")
#结果为:
验证了
f1

对比下面的例子

#进入前,先验证,不改变原来 tv 的函数
def login(func):  #这里传进了参数就是 tv的地址
    print("验证了")
    return func  #返回f1的地址
def tv(name):
    print("tv")

tv=login(tv)  #这里用装饰器 @login替换,就是产生了一个新的函数
tv("aa")
#结果为:
验证了
tv

装饰器,与参数

def login(func): #func=tv
    def inner(arg):  #内置函数第一次只扫描,返回inner
        print("验证了")   #未执行不打印
        return func(arg)  #执行tv(arg)
    return inner
@login
def tv(name):
    print("tv")

tv("aa")   #相当于login(tv)
#结果为:
验证了
tv

装饰器框架

def before(*arg,**kargs):
    print("before")
def after(*arg,**kargs):
    print("after")
def fiter(before_func,after_func):  #before,after
    def outer (main_func):  #index
        def inner(*arg,**kargs):
            before_func(*arg,**kargs)
            main_func(*arg,**kargs)
            after_func(*arg,**kargs)
        return inner
    return outer
@fiter(before,after)   #产生新的 index
def index(*arg,**kargs):
    print("index")
index("aa","bb")
#结果为:
before
index
after

单线程实现并发运算

import time  #导入类库
def consumer(name):
    print("%s 准备吃包子啦!"%name)
    while True:
        baozi=yield  #返回参数,接收send传过来的参数,yield捕获的意思
        print("包子[%s]来了,被[%s]吃了"%(baozi,name))
def producer(name):
    c=consumer("A")
    c2=consumer("B")
    c.__next__()
    c2.__next__()
    print("开始准备做包子了")
    for i in range(1,5):  #循环4次
          time.sleep(1)  #间隔1秒
          print("做了两个包子")
          c.send(i)   #将数值传给 yeild
          c2.send(i)
producer("aa")
#结果为:
A 准备吃包子啦!
B 准备吃包子啦!
开始准备做包子了
做了两个包子
包子[1]来了,被[A]吃了
包子[1]来了,被[B]吃了
。。。。。。

递归

递归算法是一种直接或者是间接调用自身算法的过程

  • 递归就是在过程中或函数里调用自身
  • 在使用过程中必须有一个递归结束条件,递归出口
  • 递归算法简洁,但是效率低,不提倡设计程序
  • 递归次数过多,会造成内存溢出
    要求

  • 每次调用在规模上都缩小(通常是减半)

  • 两次相邻的递归须有紧密联系
  • 每次递归须有条件

递归算法从数列中找出一个数


#递归算法从数列中找一个数
def binary_search(data_source,find_n):
    mid=int(len(data_source)/2)  #得到中间数的下标
    if len(data_source)>=1:
        if data_source[mid]>find_n:
            print("在[%s]左边"%data_source[mid])
            binary_search(data_source[:mid],find_n) #切片,调用自身函数递归
        elif data_source[mid]<find_n:
            print("在[%s]右边"%data_source[mid])
            binary_search(data_source[mid:],find_n)
        else:
            print("找到了[%s]"%data_source[mid])
    else:
        print("找不到")
if __name__=="__main__":
   # data=list(range(1,600,3))  #转化成列表
    data = list(range(1,10))  # 转化成列表
   # print(data)
binary_search(data,4)    #执行函数,找到数值4
#结果为:
在[5]左边
在[3]右边
找到了[4]

自动创建空列表

a=[i for i in range(4)]
print (a)
#上面是简写
a=[]
for i in range(4):
    print(i)
    a+=[i]
    print(a)
#结果为:
[0, 1, 2, 3]
--------------
0
[0]
1
[0, 1]
2
[0, 1, 2]
3
[0, 1, 2, 3]

需求打印一个二维数组

a=[[i for i in range(4)] for j in range(4)]
print(a)
for row in a:
    print(row)
#结果为:
[[0, 1, 2, 3], [0, 1, 2, 3], [0, 1, 2, 3], [0, 1, 2, 3]]
[0, 1, 2, 3]
[0, 1, 2, 3]
[0, 1, 2, 3]
[0, 1, 2, 3]

需求将上面的二维列表转90度

data=[[i for i in range(4)] for j in range(4)]
for r_index,row in enumerate(data):
    print(row)
    for c_index in range(r_index,len(row)):
        tmp=data[c_index][r_index]
        data[c_index][r_index]=row[c_index]
        data[r_index][c_index]=tmp
        print("-----------")
        for r in data:
            print(r)
print("**************************")
#重新构造
for i in range (len(data)):
    data2=[data[i][i] for row in range(4)]
    print(data2)

print("**************************")
for i in range (len(data)):
    #data3=[data[i][i] for row in range(4)]
    data3=[data[i][i]]
    print(data3)
#结果为:
[0, 0, 0, 0]
[1, 1, 1, 1]
[2, 2, 2, 3]
[3, 3, 2, 3]

斐波那契数列

a=[]
def func(arg1,arg2,stop):
    if arg1==0:
        pass
    arg3=arg1+arg2
    a.append(arg3)
#    print(arg3)
    if arg3<stop:
        func(arg2,arg3,stop)  #调用自身程序
    else:
        print(a)

func(0,1,30)
#结果为:
[1, 2, 3, 5, 8, 13, 21, 34]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值