python-8

递归函数

# 递归函数:自己调自己
from sys import setrecursionlimit
setrecursionlimit(10000)
# def wahah():
#     print('wahah')
#     wahah()
#
# wahah()

# from sys import setrecursionlimit
# setrecursionlimit(10000)
# 可以设置递归深度,执行不到10万次,最大递归是10万次,可能因为内存溢出就结束了

lst=['a1','a2',['a11','a12',['b11','b12']]]
# print(isinstance(lst,list))
# for i in lst:
#     if type(i) is list:
#         for j in i:
#             if isinstance(j,list):
#                 for k in j:
#                     print(k)
#             else:
#                 print(j)
#     else:
#         print(i)



# 函数方式取出所有内容
# def func(lst):
#     for i in lst:
#         if isinstance(i,list):
#             func(i)
#         else:
#             print(i)
# func(lst)


# 总结:
# 什么时候用?
# 一般程序每一层的逻辑是一样,只是数据不同,那这个时候我们就用递归函数
# l=[1,[88,80.2],4,[5,6,7,8,[6,3,2,1]]]    #求和
# def func(s1):
#     for i in s1:
#         if type(i) is list:
#             for j in i:
#                 if isinstance(j,list):    #[88,80.2]     [5,6,7,8,[6,3,2,1]
#                     for k in j:   #5,6,7,8
#                         if isinstance(k, list):
#                             for g in k:
#                                 print(g)    #6,3,2,1
#                         else:
#                             print(k)
#                 else:
#                     print(j)    #88,80.2
#
#         else:
#             print(i)    #1,4
#     # return i+j+k+g
#
# ret=func([1,[88,80.2],4,[5,6,7,8,[6,3,2,1]]])
# print(ret)



count=0
def func(lst):
    for i in lst:
        global count
        if isinstance(i,list):
            func(i)
        else:
            count+=i
    # print(count) #1


    return count
ret=func([1,[88,80.2],4,[5,6,7,8,[6,3,2,1]]])
print(ret)



def func(lst):
    cof isinstance(i,list):
            ret=func(i)
            count+=ret
        else:
            unt = 0
            for i in lst:
                i
            count+=i
    return count
ret=func([1,[88,80.2],4,[5,6,7,8,[6,3,2,1]]])
print(ret)


# 为什么叫递归?
# 往下叫递,往回叫归、

迭代器
#迭代器,可迭代的
# ret=range(10000)
# iterator=ret.__iter__()  把它变成迭代器
# ret=range(5)
# iterator=ret.__iter__()
#
# print(iterator)
# print(iterator.__next__())
# print(iterator.__next__())
# print(iterator.__next__())


# 所谓迭代器就是从这个数据里面一个一个取值,没取之前不占内存空间
# 迭代器特点:1.一个一个取值,惰性机制,而不是一次性把所有的数据创建出来
# 2.只能按照顺序取值,不能跳过也不能回头
# 3.迭代器中的数据你不取去它就不会创建
# 4.一个迭代器中的数据只能从头到尾取一次
#
# 可迭代协议:iter
# 如果一个数据类型中有iter方法,那么这个数据就叫可迭代类型
#
# 迭代器协议:iter+next
# 如果一个数据类型中有iter方法也有next方法,那么这个数据类型就叫迭代器类型

# 可迭代的:
# print('__iter__'in dir('hello'))  #True
# print('__iter__'in dir('432'))#True
# print('__iter__'in dir(['432']))#True
# print('__iter__'in dir((13,))#True
# print('__iter__'in dir(42))    #False


# 迭代器:目前学的所有数据类型都不是迭代器
# print('__next__'in dir(42))  #False

# f=open('1.递归函数.py',encoding='utf-8')
# print('__next__'in dir(f))    #True
# 文件操作符是一个迭代器



# lst=[1,2,3,4]
# iter=lst.__iter__()
# print('__next__' in dir(iter))
# print(iter)
# print(iter.__next__())
# print(iter.__next__())
# print(iter.__next__())
# print(iter.__next__())
# print(iter.__next__())


# 有什么用?
# for 循环没有迭代器就迭代不了
# for 底层源代码
# 所有能被for循环的至少是一个可迭代的类型
# lst=[1,2,3,4]
# iter=lst.__iter__()
# while True:
#     try:
#         print(iter.__next__())
#     except StopIteration:
#         break



# # 生成器
# 生成器的本质就是一个迭代器
# 生成器函数
# 生成器表达式

# def func():
#     print(111)
#     yield 222
# generator=func()
# print(generator.__next__())    #  生成器函数
# yield 作用和return 作用一样,返回数据


# yield 和return 区别:
# yield 是分段来执行,一个函数,return 直接停止执行函数

# def func():
#     print(111)
#     yield 222
#     print(2222)
#     yield 3333
#     print(3333)
#     yield 4444
# generator=func()
# print(generator.__next__())
# print(generator.__next__())
# print(generator.__next__())


#send  方法

# def eat():
#     print('吃什么')
#     a=yield '吃火锅'
#     print(a)
#     b=yield '吃窝窝头'
#     print(b)
#     c=yield '卷饼'
#     print(c)
# gen=eat()
# gen.__next__()
# gen.send('胡辣汤')
# gen.send('狗粮')
# gen.send('苗亮')

# send 和 next的区别:
# 1.都是让生成器向下走一次
# 2.send是给上一个yield的位置传递值,但是不能给最后一个yield发送值,在第一次执行生成器代码的时候不能使用send()

def eat():
    print("反")
    a=yield "1"
    print("a",a)
    b=yield '2'
    print("b",b)
    c=yield '3'
    print("c",c)
gen=eat()

# print(gen)
for i in gen:
    print(i)

各种推导式

# lat=[1,2,3,4]
# lst=[]
# for i in lat:
#     lst.append(i*2)
# print(lst)



# 列表推导式
# lst=[i*2 for i in lat]    结果 for 变量  in  可迭代对象
# print(lst)

# lst2=[1,2,3,4,5,67,7,8]
# lst2=[i for i in lst2 if i%2==0]
# print(lst2)

# 取100以内所有的偶数
# lst3=[i for i in range(100) if i%2==0]
# print(lst3)



# lst3=[i for i in range(100) if i%3==0]
# print(lst3)
#
#
# lst3=[i*i for i in range(100) if i/3==0]
# print(lst3)


names = [['Tom','Billy','Jefferson','Andrew','Webley','Steven'],
      ['Alice','Jill','Ana','Wendy','Jennifer','Sherry','Eva']
]
new_lst2=[name for lst in names for name in lst if name.count('e')>=2]
print(new_lst2)

# 总结   [结果 for 变量   in 可迭代对象 if 条件筛选]

# dic={'a':10,'b':20}
# new={dic[key]:key for key in dic}
# print(new)

# 生成器表达式
# lst=[1,2,3,4,5]
# gen=(i*2 for i in range(5))
# print(gen)
#一种取值方式
# print(list(gen)) #列表取值   这个把gen值取完了
#for 循环另外一种取值方式
# for i in gen:
#     print(i)

# 生成器是程序员能够自己写的迭代器
# 生成器函数  yield关键字
# 带yield关键字就是生成器函数
# 生成器表达式:
# g=(表达式)
# 所有的生成器都符合迭代器的特点
# 1.一个一个取值,而不是一次性把所有数据创建出来,生成器数据不取不创建
# 2.只能按照顺序取,不能跳过不能回头
# 3.一个生成器中的数据只能从头到尾取一次

三元运算符
#比如两个数比较大小,找到比较大的值
# a=10
# b=5
# count=0
# if a>b:
#     count=a
# else:
#     count=b
# print(count)


# 三元运算符写法
a=10
b=5
count=a if a 
  

匿名函数
# 什么叫匿名函数?
# 如果一个函数的功能非常小,只有一句代码
# 这个时候我们可以把这个函数创建成一个匿名函数

# 匿名函数又叫lambda 表达式
# def func(a,b):
#     return a+b
#
# ret=func(1,2)
# print(ret)

# lambda 参数:返回值
# func2=lambda a,b :a+b
#
# print(func2(1,2))

# 看函数名字
# print(func2.__name__)
# func=lambda a,b : a if a>b else a
# # print(func(10,3))


# func=lambda a : a%2==0
# print(func(10))

# func=lambda a: '偶数' if a%2==0 else '奇数'
# print(func(10))


# func=lambda a : a if a>0 else -a
# print(func(-3))


# lambda   也可以不传参,这种比较冷门
func=lambda : -5 if -5>0 else --5
print(func())

os模块
import os

# ret=os.path.getsize()  获取文件的大小

# ret1=os.path.dir()   判断路径是都是一个文件夹

# ret2=os.path.isfile()   判断路径是否是一个文件

# ret3=os.listdir()  查看当前文件夹下的所有文件


# 文件拼路径   #第一个参数是文件夹的名字,第二个参数可以是文件夹或文件名
# ret4=os.path.join(r'D:\study\day6\haha','day3')
# print(ret4)

# 文件夹相关操作
# os.mkdir('dir1')  #已存在就不能再新建

# os.mkdir(r'D:\study\day 8\dir1')   通过绝对路径创建文件夹

# os.mkdir('dir1/dir2')   #可以生成多层的递归目录

# os.rmdir('dir1')   #删除单级目录,目录不能为空

# os.removedirs('dir1/dir2')  #目录为空则删除,并递归到上一级的目录,若上一级目录也为空,则删除,以此类推

# 操作系统相关的
# ret=os.system('dir')  # 查看所有的文件夹和文件   只执行,不关心结果,没有返回值,乱码改变不了
# print(ret)

ret8=os.popen('dir')  #执行并返回结果
# print(ret8)
# print(type(ret8.read()))   #转换成中文的读取方式
print(ret8.read().split('\n'))   #读取并切割空格


# 将path 分割成目录和文件名的形式,以元组的形式返回
# ret=os.path.split(r'D:\study\day 8\1.递归函数.py')
# print(ret)
#
# # os.rename()   #重命名
# os.rename(r'原名字',r'新名字')  重命名

# # os.remove()   #删除
# os.remove(r'文件名')  删除文件

模块的分类
# 模块的分类
# 内置模块:不需要安装,直接可以使用
# 扩展模块/第三方模块  :需要自己安装一下
# 自定义模块:  自己写的代码


import random
# random  随机
# 随机的规则:在某一个范围内抽到的每一个值的概率都相同
# random 模块:生成随机数,处理随机数

#求0到1之间的随机数,永远取不到0和1,开区间
# ret=random.random()
# print(ret)

#求随机的整数,是闭区间,需要2个参数
# ret=random.randint(1,3)
# print(ret)

#求随机区间值
# ret=random.randrange(1,15,2)   #左开右闭
# print(ret)
#
# start  --指定范围开始值,包含在范围内
# stop   --指定范围结束值,不包含在范围内
# step   --指定递增基数


#打乱顺序(洗牌),一般洗牌用
lst=[1,2,3,4,5,6,7,8,9]
# random.shuffle(lst)
# print(lst)

#随机抽取一个概率相等   微信摇骰子
ret=random.choice(lst)
print(ret)

# ret=random.sample(lst,3)  #随机抽取多个   年会抽奖
# print(ret)

# 1.列表推导式作业
# 例1:  过滤掉长度小于3的字符串列表,并将剩下的转换成大写字母
# l1 = ['Alice', 'Ji', 'An', 'Wendy', 'Jennifer', 'Sh', 'Eva']
# new_lst = [i.upper() for i in l1 if len(i) > 3]
# print(new_lst)
# 例2:  求(x,y)其中x是0-5之间的偶数,y是0-5之间的奇数组成的元祖列表
# lst=[(x,y) for x in range(6) if x%2 ==0 for y in range(6) if y%2 ==1]
# print(lst)
# 例3:  求M中3,6,9组成的列表M = [[1,2,3],[4,5,6],[7,8,9]]
# M = [[1,2,3],[4,5,6],[7,8,9]]
# m_lst=[i[-1] for i in M]
# print(m_lst)

# 2:页面显示 序号 + 商品名称 + 商品价格,如:
#               1 电脑 1999
#               2 鼠标 10
#         3  游艇 20
#               4 美女 998
# 2:用户输入选择的商品序号,然后打印商品名称及商品价格
# 3:如果用户输入的商品序号有误,则提示输入有误,并重新输入。
# 4:用户输入Q或者q,退出程序。
#
# goods = [{"name": "电脑", "price": 1999},
#          {"name": "鼠标", "price": 10},
#          {"name": "游艇", "price": 20},
#          {"name": "美女", "price": 998}, ]
#
# while True:
#     for i in goods:
#         print(goods.index(i) + 1, i['name'], i['price'])
#
#     content = input('请选择商品:')
#     if content.isdigit() and 0< int(content)  
  

你可能感兴趣的:(python,开发语言)