교체기와 생성기의 주의사항
12415 단어 수필.
교체기
교체 가능한 (교체 가능한 대상): 교체 가능한 대상은 모두 교체 가능한 것이다.예를 들어str,list,dict,tuple,파일 대상 등은 대상
__iter__
의 내부 방법만 있으면 교체 대상이라고 할 수 있다.교체기: 교체기도 교체할 수 있다. 그는
__iter__
방법뿐만 아니라 __next__
방법도 있다.교체기는 한 번에 하나의 값만 얻을 수 있으며, 제거가 끝난 후에 오류가 발생하면 교체기를 얻을 수 있습니다. 교체 가능한 대상 __iter__()
을 호출하면 교체기를 사용할 수 있습니다.__next__()
방법교체기의 특징:
:
print('__iter__' in dir([1,2,3,4]))
print('__next__' in dir([1,2,3,4]))
:
from collections import Iterable
from collections import Iterator
print(isinstance([1,2,3,4],Iterable))
str_iter = 'abc'.__iter__()
print(isinstance(str_iter,Iterator))
print(isinstance('abc',Iterable))
생성기
생성기의 본질은 바로 교체기이다. 교체기의 모든 특징을 가지고 있으며, 단지 생성기는 자신이 작성한python 코드일 뿐이다
1. 생성기 함수
생성기 함수와 일반 함수 사이의 차이점:
def g_func():
print('aaaa')
yield 1
print('bbbb')
yield 2
yield 3
g = g_func()
for i in g:
print(i)
print(g.__next__())
print(g.__next__())
print(g.__next__())
def cloth():
for i in range(1000000):
yield ' %s'%i
g = cloth()
for i in range(50):
print(g.__next__())
for i in range(50):
print(g.__next__())
2、sned 사용법(진급)
def func():
print('*'*10)
a = yield 5
print('a : ',a)
yield 10
g = func()
num = g.__next__()
# print(num)
num2 = g.send('alex')
num2 = g.send('aaaa')
print(num2)
** 다음 예에서 send는 "yield average"에서 average를 반환하고 10을 "yield average"에 전달합니다.**
def averager():
total = 0.0
count = 0
average = None
while True:
term = yield average
total += term
count += 1
average = total/count
g_avg = averager()
g_avg.__next__() ---》 , None
print(g_avg.send(10)) ---》 10, term =10, yield average , average, average = total/count
print(g_avg.send(30)) ---》 term = , average ,
print(g_avg.send(20))
print(g_avg.send(100))
print(g_avg.send(200))
생성기의 예비 장식기는send를 사용할 때 먼저next 방법을 한 번 사용해야 하며 구체적인 요소는 위의 예를 참조한다
def init(func): #
def inner(*args,**kwargs):
g = func(*args,**kwargs) #func = averager
g.__next__()
return g
return inner
@init
def averager():
total = 0.0
count = 0
average = None
term = yield average
total += term
count += 1
average = total/count
yield average
g_avg = averager()
print(g_avg.send(10))
print(g_avg.send(30))
3. 총결산
send(None) == __next__()
,send는next의 기초에서 생성기 함수 내부에 값을 업로드한다(send 작업은 생성기에서 사용하는 첫 번째 작업에 사용할 수 없다)3. 생성기 표현식
1. 도입부
(1) 목록 유도식
예1:30 이내에 3으로 나눌 수 있는 모든 수
>>> [i for i in range(30) if i%3 == 0]
[0, 3, 6, 9, 12, 15, 18, 21, 24, 27]
예2:30 이내에 3으로 나눌 수 있는 모든 수의 제곱
>>> [i**2 for i in range(30) if i%3 == 0]
[0, 9, 36, 81, 144, 225, 324, 441, 576, 729]
예3: 플러그인 목록에 두 개의'e'가 포함된 모든 이름을 찾습니다.
names = [['Tom', 'Billy', 'Jefferson', 'Andrew', 'Wesley', 'Steven', 'Joe'],
['Alice', 'Jill', 'Ana', 'Wendy', 'Jennifer', 'Sherry', 'Eva']]
>>> [j for i in names for j in i if j.count('e') == 2]
['Jefferson', 'Wesley', 'Steven', 'Jennifer']
(2) 사전 유도식
예1: 사전의 키와value를 대조합니다
>>> dic = {'a': 10, 'b': 34}
>>> {dic[k]:k for k in dic}
{10: 'a', 34: 'b'}
>>>
예2: 대소문자에 대응하는value값을 합쳐서 k를 소문자로 통일합니다
>>> dic= {'a': 10, 'b': 34, 'A': 7, 'Z': 3}
>>> {k.lower():dic.get(k.lower(),0) + dic.get(k.upper(),0)for k in dic}
{'a': 17, 'b': 34, 'z': 3}
(3) 집합 유도식
예: 목록의 각 값의 제곱을 계산하고 무게 제거 기능을 가져옵니다
>>> {i**2 for i in [1,-1,2]}
{1, 4}
2. 생성기 표현식
g = (i*i for i in y)
for i in g:
print(i)
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
피폴라치 수열=>다양한 방법의 비교(분치, 귀속, 동적 기획/추이)이렇게 하면 피폴라치 수열에는 여러 가지 해법이 있을 수 있다. 일반적인 귀속 방법에는 많은 중복 계산이 존재한다.효율은 자연히 매우 낮다.예를 들어 f(n-1)를 계산할 때 이미 f(n-2)를 계산해 냈지만 귀환은...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.