1. 8<<2等於?python
1 # 32
2 # 解釋:將8按位左移2位
3 # 8 0 0 0 0 1 0 0 0
4 # 32 0 0 1 0 0 0 0 0
2. 經過內置函數計算5除以2的餘數編程
1 print(divmod(5, 2)[1]) 2 3 #(2, 1) 2 = 5 // 2; 1 = 5 % 2
3. s=[1,"h",2,"e",[1,2,3],"l",(4,5),"l",{1:"111"},"o"],將s中的5個字符提取出來並拼接成字符串python3.x
1 s = [1, "h", 2, "e", [1, 2, 3], "l", (4, 5), "l", {1: "111"}, "o"] 2 s_g = filter(lambda x: type(x) is str, s) #因爲int類型非可迭代對象,先使用filter過濾掉 3 s_new = '' #拼接字符串變量 4 for i in s_g: 5 s_new += i 6 print(s_new)
#方法2
1 s = [1, "h", 2, "e", [1, 2, 3], "l", (4, 5), "l", {1: "111"}, "o"] 2 3 print(''.join([i for i in s if type(i) == str]))
4. 判斷"yuan"是否在[123,(1,"yuan"),{"yuan":"handsome"},"yuanhao"],如何判斷以及對應結果?app
1 l = [123, (1, "yuan"), {"yuan": "handsome"}, "yuanhao"] 2 l_yuan = str(l) #將列表轉換爲字符串 3 if 'yuan' in l_yuan: 4 print('True')
#方法2
1 l =[123, (1, "yuan"), {"yuan": "handsome"}, "yuanhao"] 2 def func(l): 3 if 'yuan' in l: 4 print(l) 5 for i in l: 6 if type(i) == tuple or type(i) == list: 7 func(i) 8 if type(i) == dict: 9 func(i.keys()) 10 func(i.values()) 11 12 func(l) 13 14 #運行結果 15 #(1, 'yuan') 16 #dict_keys(['yuan'])
5. 執行結果並解釋爲何?函數
l=[1,2,3]post
l2=l.insert(3,"hello")編碼
print(l2)spa
1 執行結果:None 2 解釋:‘.insert’方法的返回值爲‘None’
6. 計算結果以及爲何?3d
a=[1,2,[3,"hello"],{"egon":"aigan"}]指針
b=a[:]
a[0]=5
a[2][0]=666
print(a)
print(b)
1 a = [1,2,[3,"hello"],{"egon":"aigan"}] 2 b = a[:] #列表b和列表a相同 3 4 a[0] = 5 #將列表a中的第一個元素‘1’變爲‘5’ 5 a[2][0] = 666 #將列表a中的第3個元素‘[3,"hello"]’(一樣爲列表)的第1個元素變爲‘666’ 6 7 print(a) #打印更改後的列表a 8 print(b) #打印列表b,就是列表a更改前的元素 9 10 #執行結果: [5, 2, [666, 'hello'], {'egon': 'aigan'}] 11 # [1, 2, [666, 'hello'], {'egon': 'aigan'}]
7. 使用文件讀取,找出文件中最長的行的長度(用一行代碼解決)?
1 print(max([len(x) for x in open('test.py', encoding='utf-8')])) #bug:open文件的次數與for循環一致
#方法2
1 f = open('test.py', encoding='utf-8') #假設文件已經打開 2 print(max([len(i) for i in f]))
1 #方法3 2 f = open('test.py', encoding='utf-8') 3 4 from functools import reduce 5 6 print(reduce(lambda a, b: a if a > b else b, (len(i) for i in f)))
8. 分析結果
def add(s, x):
return s + x
def generator():
for i in range(4):
yield i
base = generator()
for n in [1, 11]:
base = (add(i, n) for i in base)
print(list(base))
1 #結果:[22, 23, 24 ,25] 2 #解釋: 3 #這個能夠以管道的思路來理解,首先generator()函數是第一個生成器,下一個是第一次循環的base = (add(i, n) for i in base), 4 # 最後一個生成器是第二次循環的base = (add(i, n) for i in base)。 這樣就至關於三個管道依次鏈接,可是水(數據)尚未流過, 5 # 如今到了list(base),就至關於驅動器,打開了水的開關,這時候,按照管道的順序,由第一個產生一個數據,yield 0, 6 # 而後第一個管道關閉。 以後傳遞給第二個管道就是第一次循環,此時執行了add(0, 11),而後水繼續流, 7 # 到第二次循環,再執行add(11, 11),此時到管道尾巴了,第一個數據22就產生了。此時第一個管道再開放yield 1, 8 # 流程跟上面的同樣。依次產生23,24,25; 直到沒有數據。 把代碼改一下容易理解: 9 #因爲在打開驅動器(list(base))以前,for循環已經走完了,循環體能夠表示爲:base = (add(i, n) for i in (add(i, n) for i in base)),因此,最終n=11 10 def generator(): 11 for i in range(4): 12 yield i #第1個管道 13 14 base = (add(i, n) for i in base) #第2個管道 15 base = (add(i, n) for i in base) #第3個管道 16 17 list(base) #開關驅動器
9. 若是用py2,py3下在cmd下運行會報錯嗎?爲何並提出解決方案? (編碼)
test.py (gbk方式保存):
#coding:GBK
print(「老男孩」)
擴展,可是在python2.x解釋器中,會顯式亂碼,python3.x下正常顯式,是由於解釋器自動幫咱們解碼了文件內容:
10. 經過函數化編程實現5的階乘
1 def fn(n): 2 x = 1 3 if n == 0: #0的階乘爲1 4 x 5 else: 6 for i in range(1, n+1): 7 x *= i 8 return x 9 10 print(fn(5))
1 #方法2:遞歸 2 def func(n): 3 if n == 0 or n == 1: 4 return 1 5 return n * func(n-1) 6 7 print(func(5))
11. 打印以下圖案:
*
***
*****
*******
*****
***
*
1 def print_star(n): #n必須爲奇數,此程序沒有作判斷 2 s = '*' 3 i = 1 #上部分,包含對稱行 4 j = n #下部分 5 while i < n and i % 2 != 0: 6 print((s * i).center(n)) 7 i += 2 8 while j > 0 and j % 2 != 0: 9 print((s * j).center(n)) 10 j -= 2 11 12 print_star(7)
12
def outer():
count = 10
def inner():
count = 20
print(count)
return count
inner()
print(count)
outer()
(1). 分析運行結果?
1 運行結果:20 2 10 3 分析:當調用函數outer時,按順序讀函數定義部分,outer函數內部嵌套定義了inner函數, 4 讀完inner函數的定義,首先調用了inner(),此時inner函數局部變量count爲20,故先打印了20,而後打印了outer函數內部變量10
(2).如何讓兩個打印都是20
1 #方法1:將inner函數內部的count變量刪除,將outer函數下的count變量賦值爲20便可 2 def outer(): 3 count = 20 4 def inner(): 5 print(count) 6 return count 7 inner() 8 print(count) 9 10 outer()
1 #方法2:將inner函數內部變量count = 20返回給外部函數outer的變量count 2 def outer(): 3 def inner(): 4 count = 20 5 print(count) 6 return count 7 count = inner() 8 print(count) 9 outer()
13. 輸入一個年份,判斷是不是閏年?
1 #閏年:四年一潤,百年不潤,四百年再潤 2 def leap_year(y): 3 if y % 100 == 0: 4 if y % 400 == 0: 5 print('leap year') 6 else: 7 print('not leap year') 8 elif y % 4 == 0: 9 print('leap year') 10 else: 11 print('not leap year') 12 13 leap_year(2000)
1 #方法2 2 judge = lambda year: True if (year % 4 == 0 and year % 100 != 0) or year % 400 == 0 else False 3 print(judge(1900))
14. 任意輸入三個數,判斷大小?
1 def max_three(x, y, z): 2 return max(max(x, y),z) 3 4 print(max_three(1,2,3))
15. 求s=a+aa+aaa+aaaa+aa...a的值,其中a是一個數字。例如2+22+222+2222+22222,幾個數相加以及a的值由鍵盤控制。
1 def sum_new(a, n): #a表明求和的數字,n表明相加的次數 2 sum = 0 3 a = str(a) 4 for i in range(1, n+1): 5 x = int(a * i) 6 sum += x 7 return sum 8 9 print(sum_new(2,3))
16. 請問程序有無bug,怎麼解決?
1 f=open("a") 2 while 1: 3 choice=input("是否顯示:[Y/N]:") 4 if choice.upper()=="Y": 5 for i in f: 6 print(i) 7 else: 8 break
1 #有bug, 2 # 1,只要用戶輸入非‘y/Y’字符,程序都會結束,這與提示信息不符合 3 # 2. ‘y/Y’只一次有效,若是用戶想再次查看文件內容,必須得重啓程序 4 #解決方法: 5 f = open("a") 6 while 1: 7 choice=input("是否顯示:[Y/N]:") 8 if choice.upper() == "Y": 9 for i in f: 10 print(i) 11 f.seek(0) #重置文件位置於文首 12 elif choice.upper() == "N": #嚴格要求用戶必須輸入‘n/N’方可退出程序 13 break
17.
1 def foo(): 2 print('hello foo') 3 return() 4 def bar(): 5 print('hello bar')
(1). 爲這些基礎函數加一個裝飾器,執行對應函數內容後,將當前時間寫入一個文件作一個日誌記錄。
1 def timer(func): 2 def wrapper(): 3 import time 4 res = func() 5 f = open('log', 'a+') #以追加的方式打開文件,沒有則會建立 6 s = time.asctime() #獲取當前時間:Tue Apr 18 21:46:18 2017 7 f.write(s + '\n') #將當前時間寫入log文件,並換行 8 f.close() #關閉log文件 9 return res 10 return wrapper 11 12 @timer 13 def foo(): 14 print('hello foo') 15 return () 16 @timer 17 def bar(): 18 print('hello bar') 19 20 foo() 21 22 bar()
(2). 改爲參數裝飾器,便可以根據調用時傳的參數決定是否記錄時間,好比@logger(True)
1 def logger(choice): 2 def timmer(func): 3 def wrapper(): 4 import time 5 if choice == True: 6 res = func() 7 f = open('log', 'a+') #以追加的方式打開文件,沒有則會建立 8 s = time.asctime() #獲取當前時間:Tue Apr 18 21:46:18 2017 9 f.write(s + '\n') #將當前時間寫入log文件,並換行 10 f.close() #關閉log文件 11 return res 12 else: 13 pass 14 return wrapper 15 return timmer 16 17 @logger(True) 18 def foo(): 19 print('hello foo') 20 return () 21 @logger(True) 22 def bar(): 23 print('hello bar') 24 25 foo() 26 27 bar()
18. 三次登錄鎖定:要求一個用戶名密碼輸入密碼錯誤次數超過三次鎖定?
1 with open('account',encoding='utf8') as f_account, open('lockedlist', 'a+') as f_locked: 2 l = [] #定義用戶名驗證列表,存放黑名單數據 3 f_locked.seek(0) #"a+"模式打開後,文件位置位於末尾,要遍歷文件內容,須要將指針移至文件起始位置 4 for locked_info in f_locked.readlines(): #遍歷黑名單 5 l.append(locked_info.strip()) #將黑名單數據添加進列表,注意:須要將文件中的換行符脫掉 6 7 c = [] #定義用戶登陸名列表,存儲用戶嘗試的登陸名 8 count = 1 #登錄次數計數器 9 flag = True #登錄循環控制開關 10 while flag and count < 4: 11 user = input('Please input username:') #輸入用戶名 12 pwd = input('Please input password:') #輸入用戶密碼 13 if user in l: #用戶名在黑名單中 14 print("This user is in blacklist,can't log in!") #打印提示信息 15 continue 16 c.append(user) 17 for info in f_account: #用戶名不在黑名單中,遍歷用戶登錄文件 18 user_name, user_pwd = info.strip().split(',') #將文件中的用戶名和登錄密碼賦值給斷定變量 19 if user == user_name: #用戶名符合 20 if pwd == user_pwd: #對應密碼符合 21 print('Welcome %s' % user) #打印登錄成功信息 22 flag = False #登錄成功,跳出登錄程序 23 break 24 count += 1 #對應密碼不符合,while循環計數器加1 25 break 26 count += 1 #用戶名不符合,while循環計數器加1 27 break 28 if count == 4: #若是不一樣用戶名密碼輸錯3次,關閉程序 29 print('More than 3 times wrong!') #打印提示信息 30 if len(c) == 3 and c[0] == c[1] == c[2]: #若是相同用戶名密碼輸錯3次,將該用戶名加入黑名單,限制登錄 31 print('This user has been locked!') 32 f_locked.write(user+'\n') #將錯誤3次的用戶名寫入黑名單,注意,加換行符