基礎考試

Python基礎-月考

 

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)      #開關驅動器

參考:python迭代器與生成器小結

 

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次的用戶名寫入黑名單,注意,加換行符
相關文章
相關標籤/搜索