zoukankan      html  css  js  c++  java
  • 函数

    闭包:
    1.一个嵌套函数
    2.在嵌套函数的内部函数使用外部(非全局的变量)


    nonlocal global


    迭代器 生成器 (节省内存空间)

    可迭代对象:

    可以被for的就是可迭代对象
    Python 协议
    具有.__iter__方法的就是可迭代对象
    a = 对象.__iter__ # 创建一个迭代器

    具有__iter__和__next__就是一个迭代器
    li = [1,2,3]
    a = li.__iter__()
    print(a)
    print(a.__iter__())
    print(a.__next__())
    
    
    li = [1,2,3]
    a = li.__iter__()
    print(a)
    print(a.__next__())
    print(a.__next__())  #一个一个取
    print(a.__next__())
    
    
    li = [1,2,3,4,6,7,87,8,9,90,0,0,0,0,8,7,7,67,]
    em = li.__iter__()
    while 1:
        try:
            print(em.__next__())
    
        except StopIteration:
            break
    
    for i in range(10):
        print(i)
    
    

    生成器:

    生成器的本质---迭代器
    
    生成器的产生有两种方式:生成器函数和生成器表达式。
    只要含有yield关键字的函数都是生成器函数,yield只能用在函数里,且yield和return不能共用。
    生成器函数
    生成器函数:执行之后会得到一个生成器作为返回值
    最简单的生成器:步骤1->4(generator)->4(ret)->5->6->2->3
    
    1.def generator():
    2.  print(1)  
    3.  yield
    4.ret=generator()
    
    5.print(ret)
    
    6.print(ret.__next__())
    
    yield:作为代码并不会结束一个函数
    
    
    def func():
        print(1)
        yield 5  # 我的函数走到这了
        print(2)
        yield 9  # 我的函数走到这了
    
    g = func()  # 生成一个生成器
    print(g.__next__())
    print(g.__next__())


    def eat():
    for i in range(1, 10000):
    yield '包子' + str(i)
    e = eat()
    for i in range(200):
    a=next(e)
    print(a)



    def func():
    print(1)
    a = yield 2 # 1.挂起 2.返回值 3.接受值
    print(a) # '123'
    print(3)
    b = yield 4
    print(b) #'234'
    c = yield 9

    g = func()

    print(g.__next__()) #1 2 g.send(None)
    print(g.send('123')) # send = next+传值
    print(g.send('234')) # send = next+传值
    # # 第一次调用生成器的时候使用send里边的值必须是None
    ----》1 2 123 3 4 234 9
    
    
    递归


    推导式;
    列表推导式 集合推导式 字典推导式 生成器推导式
    列表推导式:【】
    [i for i in range(10)]
    [i for i in range(10) if i%2 == 0]
    [j for i in range(10) for em in range(3) for j in range(5)]

    集合推导式:{}
    s = {i for i in range(10)}
    字典推导式{}
    {i:i+1 for i in range(10)}
    生成器推导式:()
    (i for i in range(10))


    装饰器
    def warpper(f):  # 接受被装饰的函数内存地址
        def inner(*args,**kwargs):  # 接受被装饰函数的参数
            start_time = time.time() # 新功能
            ret = f(*args,**kwargs)  # 调用被装饰的函数,被装饰参数带上
            end_time = time.time()
            print('%s函数的运行时间:%s'%(f.__name__,end_time - start_time))
            return ret               # 被装饰的函数返回值
        return inner
    
    @warpper   # func = warpper(func)  语法糖
    def func(*args,**kwargs):
        print(args)   # 打印被装饰的函数参数
        print('这是主功能!')
        time.sleep(1)
        return '大妈'  # 返回值
    ret = func(5)  #ret = func(5)  == inner(5)  返回值  func(5)
    print(ret)  # 被装饰的函数返回值





    def auto(f): # 接受一个被装饰的函数内存地址  # f == <function func at 0x0000023D5CE31E18>
    def inner(a): # 接受一个被装饰的函数的参数 a = 1
    start_time = time.time()
    print('这是auto') # func
    f(a) # 调用被装饰的函数 f(1) == func(1)
    print('这是auto')
    return inner

    def login_auot(f): # 接受一个被装饰的函数内存地址 # f == <function func at 0x0000023D5CE31E18>
    def inner(a): # 接受一个被装饰的函数的参数 a = 1
    start_time = time.time()
    print('这是login_auto') # func
    f(a) # 调用被装饰的函数 f(1) == func(1)
    print('这是login_auto')
    return inner


    @warpper # func = warpper(func)
    @login_auot # func = login_auto(func)
    @auto
    def func(a):
    print(1)

    func(1)





     
     
    内置函数:
    's'.format()  # 字符串的方法
    print(format('a','>10'))      # 公用函数  右对齐
    print(format('a','<10'))      # 公用函数  左对齐
    print(format('a','^10'))      # 公用函数  居中
    
    print(globals())  # 查看全局都哪些内容            **
    print(b)
    print(globals().get('b'))
    
    print(hash([1,2,3]))  #求对象的哈希值             *
    
    print(help(input))      # 不知道怎么用的时候可以使用help查看一下
    
    print(hex(33))           #  将10进制转换成16进制  *
    
    print(id('s'))             # 查看数据的内存地址   ***
    
    print(input(">>>"))         # 获取用户输入的内容  *****
    
    print(int())                  # 将数据转换成整型    *****
    
    print(isinstance([1,2,3],str))   #判断这个数据时什么类型  ***
    print(locals())  # 查看局部空间的内容 
    
    print(max(1,2,3,4,5))   # 求最大值              ***
    
    print(min(1,2,3,4))       # 求最小值            ***
    
    print(memoryview(b'a'))        # 查看字节的内存地址
    
    print(next())               # 迭代器中的取下一个值  ***
    
    print(oct(9))                 # 将10进制转换成8进制  **
    
    print(ord(''))     # 输入的是unicode编码的内容    **
    print(chr(20013))    # 输入的是unicode的内容        **
    
    print(pow(2,3))  #两个参数的时候求幂运算
    print(pow(2,3))    #三个参数的时候先求幂运算在取余
    
    print(repr('123'))   # 显示的是原数据        ***
    
    print(list(reversed()))  # 反转 元组,列表,字符串    ****
    
    print(round(5.472343212,3))   #四舍五入      ***
    
    print(sum({1:4,2:5}))   #求和     ***
    
    print(type('aasas'))    # 获取数据类型
    
    print(vars(str))
    print(locals())
    
    
    匿名函数:lamda  map(相当于for)  filter   from functools import reduce累加
    lamda:
    # lambda 关键字  x参数:x是返回值
    # 一行函数 用于简单需求
    # print((lambda x:x)(5))
    # lambda 的返回值只能是一个
    
    f = lambda x,y:x*y
    #print(f.__name__)     #<lambda>
    print(f(5,6))
    
    # print(sorted([7,2,3,4],reverse=True))
    
    # li = ['你好啊','我好','大家都挺好']
    
    # def func(li):
    #     return len(li)
    # print(sorted(li,key=func)) # key指定一个排序的规则
    
    # print(sorted(li,key=lambda x:len(x)))
    
    
    # li = [
    #     {'age':19},
    #     {'age':52},
    #     {'age':48},
    #     {'age':30},
    # ]
    
    # def func(li):
    #     return li['age']
    # print(sorted(li,key=func))
    
    # print(sorted(li,key=lambda x:x['age']))
    
    # li = [1,2,3,4]
    #
    # def func(a):
    #     if a > 2:
    #         return a
    # print(list(filter(func,li)))
    
    
    
    # def func(li):
    #     for i in li:
    #         if i > 2:
    #             print(i)
    #
    # func(li)
    
    # li = [1,2,3,4]
    #
    # print(list(filter(lambda x:x>2,li)))
    
    # li = [1,2,3,4,5]
    #
    # def func(i):
    #     return i+10
    # print(list(map(func,li)))  #映射
    
    
    # li = [1,2,3,4,5]
    # print(list(map(lambda x:x+10,li)))
    
    # from functools import reduce
    #
    # li = [1,2,3,4,5]
    #
    # def func(x,y):        # x=12345
    #     return x*10+y     # reduce 是做累计算的
    # print(reduce(func,li))
    json  pickle(python独有)  :dumps loads     dump load
    s = json.dumps(dic)   # 将字典对象转换成字符串
    d = json.loads(di)    # 将字符串转换成字典
    # json.dump(d,open('a','w',encoding='utf-8'))
    
    a=json.dump({"a":666},open('a','w',encoding='utf-8')) #字典转文件
    d = json.load(open('a','r',encoding='utf-8'))  #文建筑按字典
    
    
    
    
    print(pickle.dumps({'1':4}))   #将对象转换成类似二进制的东西
    print(pickle.loads(b'x80x03}qx00Xx01x00x00x001qx01Kx04s.'))  #二进制转
    pickle.dump({'2':4},open('b','wb'))
    d = pickle.load(open('b','rb'))
    shelve
    import shelve
    f = shelve.open('c',writeback=True)  #创建文件  # writeback = True 回写
    
    f['name'] = 'alex'
    
    f['age'] = 18
    
    print(f['name'],f['age'])
    
    f['name'] = ['alex','wusir']
    
    print(f['name'])
    
    print(f)  # 这样是查看不了字典
    
    for i in f:
        print(i)   #获取到所有的键
    
    print(f.keys())  #keys也不行
    
    for i in f:
        print(f[i])
    
    #dump load   咱们不用写,自动帮咱们写的
    
    f['name'] = {'2':4}
    
    print(f['name'])
    
    for i in f:
        print(i)
    
    #注意:以后你们会出现一个问题,咱们对字典的操作内容,有时候写不进去.在open
    
    print(f['name'])
    
    f['name'] = 'wusir'
    print(f['name'])   # {'2':4}
    
    f['name'] = [1,2,34]
    
    print(list(f.keys()))
    
    

    random

    random
    random.random()  0-1
    random.randint(1,10)
    random.randrange(1,21,2)
    random.choice(['alex','wusir','eva_j']])# 从有序数据结构中随机选择一个
    # print(random.choices(['wusir','tialaing','taihei','ritian'],k=2))
    # 随机选择两个,但是有重复
    # print(random.sample(['wusir','tialaing','taihei','ritian'],k=2))
    # 随机选择两个,没有重复
    # li = [1,2,3,4,6]
    # random.shuffle(li)  # 洗牌 打乱顺序
    
    
    
    随机数  验证码  微信红包
    
    print(chr(65),chr(90),chr(97),chr(122))
    
    U = chr(random.randrange(65,91))
    L = chr(random.randrange(97,123))
    n1 = random.randrange(0,10)
    n2 = random.randrange(0,10)
    print(U, L,n1,n2)

    os:模块和当前电脑操作系统做交互

    
    
    os.makedirs('app/a/b/c')   # 递归创建文件       ***
    # os.removedirs('app/a/b/c') # 递归删除文件, 当这个要删除的目录有文件就停止删除
     os.mkdir('app')   # 创建单个目录                ***
    # os.rmdir('app')     # 删除单个目录,目录如果有东西就报错不进行删除    ***
    # print(os.listdir('D:PyCharmProjects20day14'))    ****
    # 查看某个目录下的内容
    
    # 文件:
    # os.remove() #删除这个文件,删除了就不能恢复了    *****
    # os.rename()   #修改文件的名字 
    
    
    data_dir = os.sep.join(['hello', 'world'])    
    操作系统:
    # print(repr(os.sep))  #\
    # C:UsersluckyDocumentsTencent Files932023756FileRecv
    # 路径符号
    
    # print(repr(os.linesep))
    # 换行符
    
    # print(repr(os.pathsep))
    # 环境变量的分割
    
    # print(repr(os.name))
    
    # print(os.system('dir'))
    
    # print(os.popen('dir').read())               ***
    # 在写程序的时候可以下发一些操作系统的指令
    # 在linux系统上相当于发shell命令
    
    # print(os.environ) 查看 高级 -- 环境变量 -- path   *
    
    # 路径:
    # print(os.path.abspath('b'))      ****
    # 获取当前文件的绝对路径
    # print(os.path.split(r'D:PyCharmProjects20day14'))
    # 将这个文件的绝对路径分成目录和文件2
    # print(os.path.basename(r'D:PyCharmProjects20day14'))  **
    # 获取的是这个文件的名字
    # print(os.path.dirname(r'D:PyCharmProjects20day14'))   ***
    # 获取的是这个文件的目录路径
    # print(os.path.exists(r'D:PyCharmProjects20day107 今日总结.py')) **
    # 判断这个文件是否存在
    # print(os.path.isabs(r'D:PyCharmProjects20day14'))
    # 判断是否是绝对路径
    
    # print(os.path.join('C:\','app','a','b'))                 *****
    # #路径拼接的  软件开发规范 框架
    
    # os.stat()
    
    # print(os.stat('b').st_size)    os.path.getsize #获取文件大小 ,坑目录目录为0        ***
    # print(os.getcwd())  # 获取工作路劲                         ***
    
    # os.chdir('D:PyCharmProjects20day13')  # 路劲切换        *
    # print(os.getcwd())
    
    

    sys

    import sys
    
    print(sys.argv[-1])       #***
    # 接受cmd方式调用 后边的参数会传递进来
    #linux系统上  -- 后端开发 -- 数据库(文件) ip + 端口
    
    # print(sys.path)   # 添加自定义模块路劲的                 # ******
    #
    # print(sys.version)  # 版本  获取解释的版本号
    #
    # print(sys.platform)   #获取当前操作系统的平台位数          # 不是定死的
    # #
    print(sys.exit(1))

    hashilib

    # import hashlib
    # md5 = hashlib.md5('盐'.encode('utf-8'))  # 选择加密方式  加盐
    # md5.update('alex3714'.encode('utf-8')) # 将明文转成字节然后进行加密
    # print(md5.hexdigest()) # 生成密文
    
    # md5 = hashlib.md5()  # 选择加密方式  加盐
    # md5.update('alex3714'.encode('utf-8')) # 将明文转成字节然后进行加密
    # print(md5.hexdigest()) # 生成密文
    
    # sha512 = hashlib.sha512()
    # sha512.update('alex3714'.encode('utf-8'))
    # print(sha512.hexdigest())
    time
     
    print(time.time()) # 浮点型(小数)  给计算机看 计算   时间戳
    
    print(time.localtime())    ---》time.struct_time(tm_year=2020, tm_mon=2, tm_mday=17, tm_hour=21, tm_min=19, tm_sec=14, tm_wday=0, tm_yday=48, tm_isdst=0)
    
    {
     print(time.strftime('%Y-%m-%d %X'))
    print(time.strftime('%Y-%m-%d %H:%M:%S')) 
    
    
     f = time.strptime('2018-11-30 12:30','%Y-%m-%d %H:%M')}结构化
    print(time.strftime('%Y-%m-%d %H:%M:%S',f))
    print(time.strftime('%Y-%m-%d %X',f))  结构转字符串
    
    f = time.localtime()
    print(time.strftime('%X %Y-%m-%d',f))
    
    t = '2019-03-20 10:40:00'
    # 这个时间向后退一个月
    # # 1.转成结构化
    f = time.strptime(t,'%Y-%m-%d %X')
    print(f)
    # # 2.结构化时间转成时间戳
    # ts = time.mktime(f)
    # # 3.将时间戳向大变
    # new_ts = ts + 86400 * 30
    # # 4.将最新的时间戳转成结构化时间
    # new_f = time.localtime(new_ts)
    # # 5.将结构化时间转成字符串时间
    # print(time.strftime('%Y-%m-%d %X',new_f))
    
    # 获取当前时间求前一月的现在时间
    # 1.获取时间戳进行减法计算
    # new_ts = time.time() - 30*86400
    # # 2.最新的时间戳转成结构化时间
    # new_f = time.localtime(new_ts)
    # # 3.将结构化时间转成字符串时间
    # print(time.strftime('%Y-%m-%d %X',new_f))
    
    # time.strftime()
    
    
    
    datatime
    from datetime import datetime
    
    print(datetime.now())  #2019-03-20 11:35:25.(471359)毫秒
    # 时间对象
    
    f = datetime.timestamp(datetime.now())  # 将时间对象转换成时间戳
    print(datetime.fromtimestamp(f))        # 将时间戳转成时间对象
    
    
    print(datetime.strptime('2018-11-30','%Y-%m-%d'))
    # 将字符串转成时间对象
    f = datetime.now()
    print(datetime.strftime(f,'%Y-%m-%d'))
    #将时间对象转成字符串
    
    from datetime import datetime,timedelta  # 从xx导入 建议
    print(datetime.now() - timedelta())
    
    

    collection

    from collections import deque
    # 双端队列
    
    d = deque([1,2,3,4])
    d.append(5)      #右边添加
    print(d)
    d.appendleft(10) # 左边添加
    print(d)
    d.insert(2,99)
    
    
    print(d)
    d.remove(3)
    print(d)
    
    
    print(d.pop())   # pop()有返回值
    print(d)
    print(d.popleft())
    print(d)

    setdefault

    from collections import defaultdict
    # 默认字典
    
    
    li = [
        {'name':'alex','hobby':'抽烟'},
        {'name':'alex','hobby':'喝酒'},
        {'name':'alex','hobby':'烫头'},
        {'name':'alex','hobby':'撩妹'},
        {'name':'wusir','hobby':'小宝剑'},
        {'name':'wusir','hobby':'游泳'},
        {'name':'wusir','hobby':'打牌'},
        {'name':'太白','hobby':'烫头'},
        {'name':'太白','hobby':'洗脚'},
        {'name':'太白','hobby':'开车'},
    ]
    
    d = defaultdict(list)
    
    for i in li:
        d[i['name']].append(i['hobby'])
    print([dict(d)])  #合并同类项
    -->[{'alex': ['抽烟', '喝酒', '烫头', '撩妹'], 'wusir': ['小宝剑', '游泳', '打牌'], '太白': ['烫头', '洗脚', '开车']}]
    
    
    
    2:
    D.setdefault(key[,default=None(可更改)])   字典查找如果指定键的值不存在时,返回该值,默认为 None。


     
  • 相关阅读:
    昨天又学到了dp
    LeetCode面试题17.13
    leetcode971
    今天又一题,单调队列leetcode862
    今天学到了一招,LeetCode863
    今天一道简单题,数组排序LeetCode973
    es面试题
    es的常用配置
    es基础一张图
    JMeter中引入外部的JAR包给bean shell 使用
  • 原文地址:https://www.cnblogs.com/qj696/p/12321335.html
Copyright © 2011-2022 走看看