range()、list()等内部有 __ iter __()魔法方法 for循环遍历数据之前,可迭代的对象会自动调用 __ iter __()魔法方法,会将可迭代对象变为迭代器,然后迭代器调用自身的 __next __ ()方法取值 迭代器:迭代取值的工具,通过不依赖索引的的迭代取值方式(它本身也有 __ iter __()方法,执行它是不是变为迭代器,而是返回迭代器本身) 可迭代对象不一定是迭代器
li = [1, 2, 3, 4] # iterable可迭代的对象 li_iter = li.__iter__() # 将可迭代对象转为迭代器 try: while True: print(li_iter.__next__()) except Exception as f: # 异常捕获 print(f)①看该对象中是否含有 __ iter __()方法 ②使用isinstance判断一个对象是否可迭代与type类似
from collections import Iterable print(isinstance('123', Iterable)) # 结果为True print(isinstance([1, 2, 3], Iterable)) # 结果为True print(isinstance(123, Iterable)) # 结果为False print(isinstance('asb', (str, int))) # 判断一个对象是不是整数或者字符串类型①li_iter = li.__iter__() # 将可迭代对象转为迭代器 ②li_iter = iter(li) 迭代器不能通过索引取值只能通过next(li_iter)或者li_iter.__next __()取值,只能一个一个顺延取值,超出就报错
在python中一边循环一边计算的机制,叫做生成器(generator) 作用:如果有海量数据存入内存会造成资源浪费,生成器会在循环的过程中根据算法推断出后续需要的元素,不用存储完整数据,只使用需要的数据从而减小内存消耗,简而言之又想使用大量数据,又想占用少量内存空间
①生成器表达式(元组推导式)
②生成器函数 通过yield关键字创造生成器,工作原理也是调用next()或者 __next __()直到捕获异常
def demo(num): n = 0 while n < num: yield n # yield返回一个值,并且记住这个返回值的位置,下次调用的时候 # 就会从next的下一条语句执行,与return的区别就是,一个直接结束,一个直到捕获异常 n += 1 res = demo(10) print(res) # <generator object demo at 0x0000022F4A807148> print(next(res)) # 0①定义:单例模式是一种常用的软件设计模式,通过单例模式可以保证一个类只有一个实例,该实例易于外界访问,单例模式更加方便对实例个数进行控制从而节约系统资源,如果希望在系统的某个类中的对象只存在一个那么单例模式就可以做到,通常应用在一些资源管理器中如日志记录等 ②实现
# class OneDemo: # pass # s1 = OneDemo() # s2 = OneDemo() # print(id(s1)) # 2130555857608两个内存地址不一样,一个类可以创建多个实例 # print(id(s2)) # 2130555857224 class Me(): __in = None def __new__(cls, *args, **kwargs): if cls.__in is None: cls.__in = super().__new__(cls) return cls.__in else: return cls.__in s1 = Me() s2 = Me() print(id(s1)) # 1461152368200两个内存地址一样,只能创建一个实例 print(id(s2)) # 1461152368200引入:在实际的开发中,开发者想要执行对象里的属性或者方法时,无法确定该方法以及属性是否存在,这时候就需要一些特殊的方法来访问和操作这个未知的方法或者属性,此时就会用到反射 介绍:通过字符串的形式导入模块,通过字符串的形式去模块中寻找指定函数并执行,利用字符串的形式去对象(模块)中操作(CRDU)成员,是一种基于字符串的事件驱动 ③实现:常用作页面之间的跳转
from demol import views def run(): ipt = input('输入你想访问的页面:') modules, func = ipt.split('/') obj = __import__(modules) print(obj) # <module 'views' from 'D:\\base_archive\\demol\\views.py'> if hasattr(obj,func): func = getattr(obj,func) # views.login func() # views.login() else: print(404) # if ipt == 'login': # views.login() # elif ipt == 'sign_in': # views.sign_in() # elif ipt == 'home': # views.home() # else: # print('404') run()GIL(global interpreter lock)是计算机程序设计语言解释器用于同步线程的工具,保证任何时刻仅有一个线程在执行,它并不是python语言的特性,并不是所有的python解释器有GIL,cpython常用的python解释器,他就有GIL,而Jython和Ironpython就没有GIL,cpython的线程是操作系统的原生线程,完全由操作系统调度线程执行,由于它保证了同一时间只有一个线程在运行所以,他不能利用多核计算机的优势,禁止多线程并行执行,所以会损失许多多线程的性能,但是他也保护了对于python对象的访问。
GIL本质就是一把互斥锁,既然是互斥锁,所有互斥锁的本质都一样,都是将并发运行变成串行,以此来控制同一时间内共享数据只能被一个任务所修改,进而保证数据安全。