Python 基本結構類型基礎實戰【生成器函數、迭代器、切片】

#生成器函數
def f():
    a, b = 1, 1
    while 1:
        yield a #暫停執行,需要時再產生一個新的元素
        a, b = b, a+b

#這樣做可以節省內存,而不用開list保存所有的中間結果
#也不必要一次性print所有中間結果

a = f()
for i in range(10):
    print(a.__next__(),end = ' ') #__next__迭代器方法

#Answer:1 1 2 3 5 8 13 21 34 55

a = f()
b = next(a)
print(b)
b = next(a)
print(b)
b = next(a)
print(b)
#pass
#Answer:
#1
#1
#2 處於yield

#迭代器
class Fab(object):

    def __init__(self, max):
        self.max = max
        self.n, self.max, self.b = 0, 0, 1

    def __iter__(self):
        return self

    def __next__(self):#py3.*需寫成__next__,for循環中自動調用__next__()
        if self.n < self.max:
            r = self.b
            self.max, self.b = self.b, self.a + self.b
            self.n = self.n + 1 
            return r
        raise StopIteration() #拋出異常表示迭代結束

for item in Fab(10): #迭代器訪問
    print(item, end = ' ')

#Answer:1 1 2 3 5 8 13 21 34 55


def count(start , step):
    num = start
    while True:
        yield num
        num += step

x = count(3, 5) #目前的x是迭代器對象
for i in range(10):
    print(next(x),end = ' ')
print()
#Answer:3 8 13 18 23 28 33 38 43 48

def demo(*para):
    average = sum(para)/len(para)
    #print(average)
    g = [i for i in para if para[i] > average]
    return [average,] + list(g) #返回列表

g = demo(1,2,3,3,3,4,4,5,3,6,1,2,3,3,5,2,1,3)
print(g)

#Answer:[3.0, 5, 6, 5]

def demo(*para):
    average = sum(para)/len(para)
    #print(average)
    g = [i for i in para if para[i] > average]
    return (average,) + tuple(g) #返回元組

g = demo(1,2,3,3,3,4,4,5,3,6,1,2,3,3,5,2,1,3)
print(g)

#Answer:(3.0, 5, 6, 5)

def get_A(s):#統計一個字符串的大寫字母數量和小寫字母數量
    x, y = 0, 0
    for i in range(len(s)):
        if s[i] >= 'A' and s[i] <= 'Z':
            x += 1
        elif s[i] >= 'a' and s[i] <='z':
            y += 1
    return (x, y)
str = "aoewinawioneAOWENOAINWEOITsswoinfaoinwe"
g = get_A(str)
print(g)

#Answer:(14, 25)

def demo(s):#函數等價於上述函數
    g = [0, 0]
    for ch in s:
        if ch.islower():
            g[1] += 1
        elif ch.isupper():
            g[0] += 1
    return tuple(g)
str = "aoewinawioneAOWENOAINWEOITsswoinfaoinwe"
g = demo(str)
print(g)

def reversek(s, k):#給一個字符串s,給一個下標k,實現k之前元素逆序,k之後元素逆序,再整體逆序
    r = len(s)
    for i in range (0 , k):
        if i > k / 2:
            break
        s[i], s[k - 1 - i] = s[k - 1 - i], s[i]
    for i in range (k , r):
        if(i > (r + k) / 2):
            break
        s[i], s[r - 1 - i] = s[r - 1 - i], s[i]
    for i in range (0 , r):
        if(i > r / 2):
            break
        s[i], s[r - 1 - i] = s[r - 1 - i], s[i]
    return s

str1 = [1,2,3,4,5,6,7,8,9] #str類型不能被搞來搞去,所以這裏改成了列表
ans_str = reversek(str1 , 3)
print(str1)

def reverseK(s, k):#同上述函數
    x = s[0 : k-1 : -1] #切片操作並反轉
    y = s[k-1 : -1 : -1] #切片操作並反轉
    return list(reversed(x + y))
str1 = [1,2,3,4,5,6,7,8,9] #str類型不能被搞來搞去,所以這裏改成了列表
ans_str = reversek(str1 , 3)
print(str1)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章