[ python ] 練習做業 - 3

1. 寫出Python查找一個變量的順序 提示:4中做用域的順序html

 

本地做用域(local) --> 當前做用域被嵌入的本地做用域(enclsing locals) --> 全局/模塊做用域(Global) --> 內置做用域(build-in)編程

 

2. Python裏的拷貝,打印結果並解釋。數據結構

 

http://www.javashuo.com/article/p-knnbfirp-bo.html閉包

 

3. 打印代碼的值,並解釋其緣由。app

a = 1


def fun(a): # 局部做用域中
    a = 2   # a 從新定義爲2
    return a    # 首先在局部做用域中找,找到 a = 2返回


print(fun(a))   # 返回 a=2
print(a)    # 在本地全局環境中找,找到 a = 1

 

 

4. 打印代碼的值,並解釋其緣由。dom

a = []


def fun(a):
    a.append(1)
    return a 


print(fun(a))   # a = [] a.append(1) = [1,]
print(a)    # a =[] 是可變數據類型

 

 

5. L = [x*x for x in range(10)] 和 g = (x*x for x in range(10))的結果分別爲:函數

L = [x * x for x in range(10)]

print(L)  # list表達式,有多少值都會經過列表顯示出來

g = (x*x for x in range(10))

print(g)    # 返回一個生成器,不會打印任何值,須要經過 next 或者 for循環進行遍歷


執行結果:

[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
<generator object <genexpr> at 0x000002632AA334C0>

 

 

6. 將列表生成式中[]改爲() 以後數據結構是否改變?請說明緣由。ui

[]:列表生成式,返回一個list列表,顯示全部元素
(): 返回一個生成器,須要經過 next() 或 for 來遍歷結果

 

 

7. 建立一個閉包必須知足那些條件:spa

    (1)必需要一個嵌套函數
    (2)嵌套函數必須引用外部函數中的變量
    
    提示:裝飾器就是一個閉包函數

 

 

8. 經過函數化編程實現5的階乘 提示:在函數中使用遞歸 例如函數中傳入5,計算出5*4*3*2*1的結果3d

def func(n):
    if n == 1:
        return n
    return n * func(n - 1)


print(func(5))

 

 

9. 爲此函數加裝飾器

def log(func):
    def wrapper(*args, **kwargs):
        res = func(*args, **kwargs)
        return res

    return wrapper


@log
def foo():
    print('hello foo')


foo()

 

 

10. 寫函數,將字典做爲參數傳進函數,檢查傳入字典的每個value的長度,若是大於2,那麼僅保留前兩個長度的內容,並將新內容返回給調用者。
PS:字典中的value只能是字符串或列表

dic = {"k1": "v1v1", "k2": [11, 22, 33, 44]}


def func(dic):
    for k, v in dic.items():
        if len(v) > 2:
            dic[k] = v[:2]
    return dic

 

 

11. 寫函數,檢查獲取傳入列表或元組對象的全部奇數位索引對應的元素,並將其做爲新列表返回給調用者。

l1 = [0, 1, 2, 3, 4, 5, 6, 7]

f = l1[1::2]
print(f)


def func(*args):
    li = args[0]
    return li[1::2]


print(func(l1))

 

 

12. 使用內置函數將 a="1234" 變爲 [1, 2, 3, 4]

a = '1234'

l = list(map(int, a))
print(l)

 

 

13. 使用內置函數對obj = [25, 9, -23, 9, -11]按絕對值大小排序。

obj = [25, 9, -23, 9, -11]

print(sorted(obj, key=abs))

 

 

14.
1)提供2017-11-1 2017-11-30 打印出他們之間的日期

import time

start_time = time.mktime(time.strptime('2017-11-1', '%Y-%m-%d'))
end_time = time.mktime(time.strptime('2017-11-30', '%Y-%m-%d'))

while end_time >= start_time:
    print(time.strftime('%Y-%m-%d', time.localtime(start_time)))
    start_time += 86400.00

 

 

2)打印出 2017-11-1 2017-11-30的之間日期,並打印出各自對應的星期。

import time

start_time = time.mktime(time.strptime('2017-11-1', '%Y-%m-%d'))
end_time = time.mktime(time.strptime('2017-11-30', '%Y-%m-%d'))

while end_time >= start_time:
    w_dic = {0: '星期一', 1: '星期二', 2: '星期三', 3: '星期四', 4: '星期五', 5: '星期六', 6: '星期日'}
    print(time.strftime('%Y-%m-%d', time.localtime(start_time)), w_dic[time.localtime(start_time).tm_wday])
    start_time += 86400.00

 

 

15. 使用生成器編寫foo函數,調用該函數foo(21)產生以下結果(斐波那契數列),1,1,2,3,5,8,13,21

def foo(n):
    a, b = 0, 1
    while b < n:
        yield b
        a, b = b, a+b


f = foo(21)

 

 

16. 讀取文件a.txt,匹配文中全部ip地址,將全部ip地址加入到一個列表中,打印該列表。

import re
with open('ip.txt') as f:
    i_list = []
    for line in f:
        ip_list = re.findall(r'((([01]{0,1}\d{0,1}\d|2[0-4]\d|25[0-5])\.){3}([01]{0,1}\d{0,1}\d|2[0-4]\d|25[0-5]))',
                             line)
        for ip in ip_list:
            i_list.append(ip[0])

print(i_list)

 

 

17. s = '123.33sdhf3424.34fdg323.324',計算字符串中全部數字的和

import re

s = '123.33sdhf3424.34fdg323.324'

r = re.findall("\d*\.\d*", s)

n = 0
for num in r:
    n += float(num)

print(n)

 

 

18. 正則替換:

1.將字符串中全部的數字換爲大寫字母A, 結果爲 aakkAdddAkkA
result=aakk123ddd55kk66

import re
result='aakk123ddd55kk66'
r = re.sub("\d+", 'A', result)  # re.sub(匹配到的正則,'替換的內容', '須要被替換的內容')
print(r)

 

 

2.將字符串的前4位數字轉換爲A

import re
result='aakk123ddd55kk66'
r = re.sub("\d", 'A', result, 4)  # re.sub(匹配到的正則,'替換的內容', '須要被替換的內容')
print(r)

 

 

19. 利用random模塊隨機生成四位驗證碼,包括字母和數字

import random

code = ''
for i in range(4):
    ran_int = random.randint(1, 9)
    ran_str = chr(random.randint(65, 90))
    n = random.choice([str(ran_int), ran_str])
    code = ''.join([code, n])

print(code)

 

 

20. 以下,每一個小字典的name對應股票名字,shares對應多少股,price對應股票的價格,用filter過濾出,單價大於100的股票有哪些

portfolio = [
{'name': 'IBM', 'shares': 100, 'price': 91.1},
{'name': 'AAPL', 'shares': 50, 'price': 543.22},
{'name': 'FB', 'shares': 200, 'price': 21.09},
{'name': 'HPQ', 'shares': 35, 'price': 31.75},
{'name': 'YHOO', 'shares': 45, 'price': 16.35},
{'name': 'ACME', 'shares': 75, 'price': 115.65}
]

f = filter(lambda x: x['price']> 100, portfolio)
print(list(f))

 

 

21. 怎麼理解迭代器和生成器?生成器有什麼特色?

可迭代的:
    必須包含 __iter__ 方法

迭代器:
    必需要有 __iter____next__ 方法

迭代器必定是可迭代的,可迭代的不必定是迭代器

生成器:

生成器是一種特殊的迭代器,生成器自動實現了「迭代器協議」(即__iter__和__next__方法),不須要在手動實現這兩方法
生成器在迭代的過程當中能夠改變當前迭代值,而修改普通迭代器的當前迭代值每每會發生異常
具備yield關鍵字的函數都是生成器

 

 

22. 函數的形參有哪幾種方式,各自在什麼狀況下使用以及存放順序?

位置參數:func(a)     # 任何類型
默認參數:func(a=1)    # 不傳參數時,使用默認值
可變參數:func(*args)    # 傳入list、tuple 類型
關鍵字參數:func(**kwargs)    # 傳入字典類型

func(a, b=1, *args, **kwargs)

 

 

23. 以下輸出如下函數的執行結果

def foo(a1, args = []):    # 設置參數時,默認參數不能爲可變數據類型
print("args before = %s" % (args))
args.insert(0, 10)
args.insert(0, 99999)
print("args = %s " % (args))

def main():
foo('a')
foo('b')

if __name__ == "__main__":
main()

 

 

24. 實現9*9乘法口訣表

for i in range(1, 10):
    for j in range(1, i+1):
        print('{}x{}={}\t'.format(j, i, i*j), end='')
    print()
相關文章
相關標籤/搜索