동지 여러분, 오늘은 Python의 기본 문제를 검토하도록 안내하겠습니다. Python이 해석된 언어이고 효율성이 다른 언어보다 낮다는 것은 모두 알고 있지만, 구매하세요. 이것은 많은 시나리오에서는 사소한 일입니다
이해하기 쉽고 배우기 쉬운 구문으로 짧은 시간에 더 많은 작업을 완료할 수 있으며 개발 효율성도 높아집니다
동시에 Python이 함께 제공됩니다. 만들어진 라이브러리는 프로그램 개발에 사용할 수 있습니다. Python은 네트워크, 파일, GUI, 데이터베이스, 텍스트 등과 같은 많은 내용을 포함하는 매우 완전한 기본 코드 라이브러리를 제공합니다. . "내장 배터리 (배터리 포함)"라고 생생하게 알려져 있습니다. Python으로 개발되었으므로 많은 함수를 처음부터 작성할 필요가 없으며 이미 만들어진 함수를 사용하면 됩니다.
Python에는 내장 라이브러리 외에도 다른 사람들이 직접 사용할 수 있도록 개발한 타사 라이브러리도 많이 있습니다. 물론, 개발한 코드가 잘 캡슐화되어 있으면 다른 사람이 사용할 수 있는 타사 라이브러리로도 사용할 수 있습니다.
Python 생성기란 무엇인가요?
g1 = (x for x in range(10))
다른 하나는 함수 정의에 있습니다. Yield 키워드가 포함되어 있습니다. :
def fib(max): n, a, b = 0, 0, 1 while n < max:yield b a, b = b, a + b n = n + 1 return 'done'g2 = fib(8)
생성자 객체 g1과 g2의 경우, 더 이상 요소가 없으면 next(g1)을 통해 계속해서 다음 요소의 값을 얻을 수 있습니다. StopIteration 오류가 보고됩니다
for 루프를 통해 요소의 값을 가져올 수도 있습니다.
생성기의 장점은 메모리를 많이 차지하지 않고, 사용할 때 요소의 값만 계산하면 된다는 것입니다.
Python 반복자란 무엇인가요?
from collections import Iterableisinstance(x, Iterable)Iterator Iterator는 next() 함수에 의해 호출될 수 있고 StopIteration이 모두 Iterator일 때까지 계속해서 다음 값을 반환한다는 의미입니다. 그러나 목록과 같은 데이터 구조는 사용할 수 없습니다. 다음 명령문 목록은 Iterator가 됩니다.
iter([1,2,3,4,5])Generator는 모두 Iterator이지만 Iterator가 반드시 Generator일 필요는 없습니다. 리스트와 튜플의 차이점은 무엇인가요?
list에는 가변 길이가 있지만 튜플은 변경할 수 없습니다.
list는 요소의 값을 변경할 수 있지만
dict: 본질적으로 순차 목록이지만 각 요소의 저장 위치 인덱스는 삽입 순서에 따라 결정되지 않고 해시 알고리즘 및 기타 메커니즘을 통해 키에 의해 동적으로 생성됩니다. 값이 저장되어야 하는 위치와 값이 저장됩니다. 따라서 dict의 쿼리 시간 복잡도는 O(1)입니다. 따라서 dict의 키는 해시 가능한 객체, 즉 불변 객체만 될 수 있습니다.
파이썬에서 멀티스레딩을 사용해 멀티코어 CPU를 함께 사용할 수 있나요?
Python에는 GIL(Global Interpreter Lock)이라는 것이 있는데, 이는 여러 스레드 중 하나만 실행되도록 보장합니다.
스레드의 실행 속도는 매우 빨라서 스레드가 병렬로 실행되는 것으로 착각하게 되지만 실제로는 모두 차례로 실행됩니다. GIL 레벨 처리 후에는 실행 오버헤드가 증가합니다.
멀티 코어 작업은 여러 프로세스를 통해 달성할 수 있습니다.
print는 py3에서는 함수이지만 py2에서는 키워드일 뿐입니다
py3 파일의 기본 인코딩은 utf8이고 py2 파일의 기본 인코딩은 ascii입니다
py3의 str은 유니코드 문자열인 반면, py2의 str은 bytes
py3의 range()는 반복 가능한 객체를 반환하고, py2의 range()는 목록을 반환하고, xrange()는 반복 가능한 객체를 반환하고, py3의 Division은 float를 반환하고, py2의 나누기는 int를 반환합니다
가변 객체와 불변 객체
가변 객체: list, dict, set
불변 객체: bool, int, float, tuple, str …
반복자와 반복자의 차이점 반복 가능한 객체
Iterable 객체 클래스인 경우 __iter__() 매직 메서드를 사용자 정의해야 하며 범위 및 목록 클래스의 인스턴스화된 객체는 모두 반복 가능한 객체입니다
Iteration Iter 클래스인 경우 __iter__() 및 __next__() 매직 메소드. iter() 함수를 사용하여 반복 가능한 객체의 반복자를 만듭니다
Closure
Closure는 외부 함수의 변수 또는 매개 변수를 사용하고 외부 함수는 다음과 같습니다. 함수는 내부 함수를 반환합니다
可以保存外部函数内的变量,不会随着外部函数调用完而销毁
什么是装饰器?
装饰器是一个接收函数作为参数的闭包函数
它可以在不修改函数内部源代码的情况下,给函数添加额外的功能
import time def calc_time(func): def inner(): t1 = time.time() func() t2 = time.time() print('cost time: {}s'.format(t2-t1)) return inner
元类是创建类的类,type还有继承自type的类都是元类
作用: 在类定义时(new, init)和 类实例化时(call) 可以添加自定义的功能
使用场景: ORM框架中创建一个类就代表数据库中的一个表,但是定义这个类时为了统一需要把里面的类属性全部改为小写,这个时候就要用元类重写new方法,把attrs字典里的key转为小写
全局解释器锁(Global Interpreter Lock)是计算机程序设计语言解释器用于同步线程的一种机制,它使得任何时刻仅有一个线程在执行。
即便在多核处理器上,使用 GIL 的解释器也只允许同一时间执行一个线程,常见的使用 GIL 的解释器有CPython与Ruby MRI。可以看到GIL并不是Python独有的特性,是解释型语言处理多线程问题的一种机制而非语言特性。
单核时代高效利用CPU, 针对解释器级别的数据安全(不是thread-safe 线程安全)。首先需要明确的是GIL并不是Python的特性,它是在实现Python解析器(CPython)时所引入的一个概念。
当Python虚拟机的线程想要调用C的原生线程需要知道线程的上下文,因为没有办法控制C的原生线程的执行,所以只能把上下文关系传给原生线程,同理获取结果也是线 程在python虚拟机这边等待。那么要执行一次计算操作,就必须让执行程序的线程组串行执行。
展开 GIL锁加在解释器一层,也就是说Python调用的Cython解释器上加了GIL锁,因为你python调用的所有线程都是原生线程。原生线程是通过C语言提供原生接口,相当于C语言的一个函数。
你一调它,你就控制不了了它了,就必须等它给你返回结果。只要已通过python虚拟机 ,再往下就不受python控制了,就是C语言自己控制了。
加在Python虚拟机以下加不上去,只能加在Python解释器这一层。
python2.x和3.x都是在执行IO操作的时候,强制释放GIL,使其他线程有机会执行程序。
Python2.x Python使用计数器ticks计算字节码,当执行100个字节码的时候强制释放GIL,其他线程获取GIL继续执行。ticks可以看作是Python自己的计数器,专门作用于GIL,释放后归零,技术可以调整。
Python3.x Python使用计时器,执行时间达到阈值后,当前线程释放GIL。总体来说比Python3.x对CPU密集型任务更好,但是依然没有解决问题。
简单来说,lambda表达式通常是当你需要使用一个函数,但是又不想费脑袋去命名一个函数的时候使用,也就是通常所说的匿名函数。
lambda表达式一般的形式是:关键词lambda后面紧接一个或多个参数,紧接一个冒号“:”,紧接一个表达式
赋值(=),就是创建了对象的一个新的引用,修改其中任意一个变量都会影响到另一个。
浅拷贝 copy.copy:创建一个新的对象,但它包含的是对原始对象中包含项的引用(如果用引用的方式修改其中一个对象,另外一个也会修改改变)
深拷贝:创建一个新的对象,并且递归的复制它所包含的对象(修改其中一个,另外一个不会改变){copy模块的deep.deepcopy()函数}
위 내용은 Python 8부작 에세이에 대해 이야기해 봅시다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!