Python 교체 기와 생 성기 인 스 턴 스 상세 설명

Python 교체 기와 생 성기 인 스 턴 스 상세 설명
1.교체 가능 한 대상 과 교체 기 대상 을 어떻게 실현 합 니까?
1.교체 가능 한 대상 으로 교체 기 대상 획득
예 를 들 어 l 은 교체 가능 대상 이 고 iter(l)는 교체 기 대상 이다.

In [1]: l = [1,2,3,4]

In [2]: l.__iter__
Out[2]: <method-wrapper '__iter__' of list object at 0x000000000426C7C8>

In [3]: t = iter(l)

In [4]: t.next()
Out[4]: 1

In [5]: t.next()
Out[5]: 2

In [6]: t.next()
Out[6]: 3

In [7]: t.next()
Out[7]: 4

In [8]: t.next()
---------------------------------------------------------------------------
StopIteration               Traceback (most recent call last)
<ipython-input-8-3660e2a3d509> in <module>()
----> 1 t.next()

StopIteration:

for x in l:
  print x
for        ,    iter(l)    t,       t.nex(),      StopIteration,     

\#아래 의 이러한 직접 함 수 를 호출 하 는 방법 은 데이터 양 이 많 을 때 네트워크 IO 에 대한 요구 가 비교적 높 으 므 로 교체 기 방법 을 사용 할 수 있 습 니 다.

def getWeather(city):
  r = requests.get(u'http://wthrcdn.etouch.cn/weather_mini?city='+city)
  data = r.json()['data']['forecast'][0]
  return '%s:%s,%s' %(city, data['low'], data['high'])
print getWeather(u'  ')
   :
: 13℃, 28℃
교체 기 대상 Weather Iterator,next 방법 은 매번 한 도시 의 기온 으로 돌아 갑 니 다.
교체 가능 한 대상 WeatherIterable,iter 방법 을 실현 하여 교체 기 대상 을 되 돌려 줍 니 다.

# -*- coding:utf-8 -*-
import requests
from collections import Iterable, Iterator

class WeatherIterator(Iterator):
  def __init__(self, cities):
    self.cities = cities
    self.index = 0

  def getWeather(self,city):
    r = requests.get(u'http://wthrcdn.etouch.cn/weather_mini?city='+city)
    data = r.json()['data']['forecast'][0]
    return '%s:%s,%s' %(city, data['low'], data['high'])

  def next(self):
    if self.index == len(self.cities):
      raise StopIteration
    city = self.cities[self.index]
    self.index += 1
    return self.getWeather(city)

class WeatherIterable(Iterable):
  def __init__(self, cities):
    self.cities = cities

  def __iter__(self):
    return WeatherIterator(self.cities)

for x in WeatherIterable([u'  ',u'  ',u'  ',u'  ']):
  print x.encode('utf-8')

  :
  :   13℃,   28℃
  :   14℃,   22℃
  :   17℃,   23℃
  :   18℃,   24℃

2.생 성기 함 수 를 사용 하여 교체 가능 한 대상 을 실현 합 니 다.
1.교체 가능 한 대상 의 종 류 를 실현 하고 주어진 범위 내의 모든 소 수 를 교체 할 수 있다.
소 수 는 1 이상 의 자연수 에서 1 과 그 자 체 를 제외 하고 다른 인수 가 없 는 수 를 소수 라 고 정의 한다.
yield 가 있 는 함 수 는 generator 입 니 다.일반 함수 와 달리 generator 를 만 드 는 것 은 함수 호출 처럼 보이 지만 함수 코드 를 실행 하지 않 습 니 다.next()를 호출 할 때 까지(for 순환 에서 next()를 자동 으로 호출 합 니 다.실행 절 차 는 함수 의 절차 에 따라 실행 되 지만 하나의 yield 문 구 를 실행 할 때마다 중단 되 고 교체 값 을 되 돌려 줍 니 다.다음 에 실행 할 때 yield 의 다음 문 구 를 계속 실행 합 니 다.한 함수 가 정상적으로 실행 되 는 과정 에서 yield 에 의 해 수 차례 중단 되 었 고 중단 할 때마다 yield 를 통 해 현재 의 교체 값 을 되 돌려 주 는 것 처럼 보 입 니 다.

class PrimeNumbers:
  def __init__(self, start, end):
    self.start = start
    self.end = end

  def isPrimeNum(self, k):
    if k < 2:
      return False
    for i in xrange(2, k):
      if k % i == 0:
        return False

    return True

  def __iter__(self):
    for k in xrange(self.start, self.end + 1):
      if self.isPrimeNum(k):
        yield k

for x in PrimeNumbers(1, 10):
  print x

  :
2
3
5
7

3.역방향 교체 실현
1.반대로 교체
예 를 들 어 부동 소수점 발생 기 Float Range(xrange 와 유사)를 실현 하고 주어진 범위(start,end)와 걸음 값(step)에 따라 일련의 연속 부동 소수점 을 생 성 합 니 다.예 를 들 어 Float Range(3.0,4.0,0.2)를 교체 하면 서열 이 생 길 수 있 습 니 다.
정방 향:3.0->3.2->3.4->3.6->3.8->4.0
역방향:4.0->3.8->3.6->3.4->3.2->3.0

class FloatRange:
  def __init__(self, start, end, step=0.1):
    self.start = start
    self.end = end
    self.step = step

  def __iter__(self):
    t = self.start
    while round(t,14) <= round(self.end, 14):
      yield t
      t = t + self.step

  def __reversed__(self):
    t = self.end
    while round(t, 14) >= round(self.start, 14):
      yield t
      t = t - self.step

for x in reversed(FloatRange(3.0, 4.0, 0.2)):
  print x
  :
4.0
3.8
3.6
3.4
3.2
3.0
for x in FloatRange(3.0, 4.0, 0.2):
    print x

3.0
3.2
3.4
3.6
3.8
4.0
위의 코드 가 round 함 수 를 사용 하 는 것 은 부동 소수점 이 비교적 정밀도 문제 가 있 기 때문에 반올림 이 필요 합 니 다.
2.교체 기 에 대해 절편 작업 을 한다.
예 를 들 어 어떤 텍스트 파일 이 있 습 니 다.그 범위 의 내용 을 읽 으 려 고 합 니 다.예 를 들 어 100-300 줄 사이 의 내용,python 의 텍스트 파일 은 교체 가능 한 대상 입 니 다.목록 절편 과 유사 한 방식 으로 100-300 줄 의 파일 내용 생 성 기 를 얻 을 수 있 습 니까?
표준 라 이브 러 리 의 itertools.islice 를 사용 하면 교체 대상 절편 생 성 기 를 되 돌려 줍 니 다.

f = open('/var/log/dmesg')

from itertools import islice

#      100 300       ,          ,  i  1
islice(f, 100, 300)

#  500   
islice(f, 500)

# 100        
islice(f, 100, None)


ps:     islice       ,           

4.여러 대상 교체
1.하나의 for 구문 에서 여러 개의 교체 가능 한 대상 을 교체 합 니 다.
1.모 반 학생 들 의 시험 성적 국어,수학,영 어 는 각각 3 개의 목록 에 저장 되 고 3 개의 목록 을 교체 하여 3 명의 학생 들 의 총 점(병행)을 계산한다.
2.모 학년 4 개 반,모 시험 각 반 의 영어 성적 은 각각 4 개 목록 에 저장 되 어 있 으 며,순서대로 각 목록 을 교체 하여,전체 학년 의 영어 성적 이 90 점 이상 인 사람(직렬)을 통계 한다.
해결 방안:
병렬:내 장 된 함수 zip 를 사용 하면 여러 개의 교체 가능 한 대상 을 합 칠 수 있 습 니 다.매번 교체 할 때마다 원 그룹 으로 돌아 갑 니 다.

from random import randint

chinese = [randint(60,100) for _ in xrange(40)]
math = [randint(60,100) for _ in xrange(40)]
english = [randint(60,100) for _ in xrange(40)]

total = []
for c,m,e in zip(chinese, math,english):
  total.append(c+m+e)

print total

  :

[204, 227, 238, 201, 227, 205, 251, 274, 210, 242, 220, 239, 237, 207, 230, 267, 263, 240, 247, 249, 255, 268, 209, 270, 259, 251, 245, 262, 234, 221, 236, 250, 251, 249, 242, 255, 232, 272, 237, 253]

직렬:표준 라 이브 러 리 의 itertools.chain 을 사용 하면 여러 개의 교체 가능 한 대상 을 연결 할 수 있 습 니 다.

from random import randint
from itertools import chain

class1 = [randint(60,100) for _ in xrange(40)]
class2 = [randint(60,100) for _ in xrange(42)]
class3 = [randint(60,100) for _ in xrange(39)]
class4 = [randint(60,100) for _ in xrange(43)]

count = 0
for s in chain(class1, class2, class3, class4):
  if s > 90:
    count = count + 1

print count

  :
38


읽 어 주 셔 서 감사합니다. 여러분 에 게 도움 이 되 기 를 바 랍 니 다.본 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!

좋은 웹페이지 즐겨찾기