幾個python練習題


從python公眾號里面看到了幾道python的練習題,就拿來練練手,結果上手了發現自己還是特別水,不是很難的8道題,我只做出來5道,其中還3道題卡住了,邊查邊做的。原題鏈接在這里:http://python.jobbole.com/83641/

 

1. 編寫代碼, 打印1-1億之內的偶數

看完題目想都沒想就直接寫了一句:

1 print [i for i in xrange(1, 10**9) if i % 2 == 0] 

開始跑結果。然后。死機了。重啟時候反省了一下,嗯,的確是有點二,一下生成五千萬個元素的列表,電腦沒炸了就算它好脾氣了。可是,總不能一個for循環打印吧,那也太low了。考慮了一下,還是用協程靠譜一點。於是重新寫了一個(在QQ群里看到別人寫的稍微改良了一點):

1 def even_maker(x):
2     for i in (i for i in xrange(1, 50000001)):
3         yield i * 2
4 
5 for i in even_maker(10**9):
6     print i, ',',

效率不太高,感覺應該有更好的辦法,不過我暫時也沒想繼續深入想了。

 

2. 寫一個函數, 用正則表達式清除字符串中[]和其中的內容。s = "[lol]你好,幫我把這些markup清掉,[smile]。謝謝!"

這個沒什么難度,用正則處理正合適。

1 s = "[lol]你好,幫我把這些markup清掉,[smile]。謝謝!"
2 print re.sub('\[.*?\]', '', s)

一行搞定(不許吐槽這是兩行)。

 

3. 請使用python, 對下面的函數進行處理,

def hello(name):
print "hello, %s" % name

在函數被調用時打印耗時詳情

<function name: hello>
<function call begin>
hello, tom
<function call end>
[timecosts: 3.81469726562e-06s]

典型的裝飾器。不過我對裝飾器是真的不熟,基本上都靠蒙。之前轉載了一遍博客:http://www.cnblogs.com/anpengapple/p/5068580.html 是裝飾器的,寫的不錯,我差不多每次都要照這個抄。這次這個裝飾器已經是相當簡單了。

 1 def name_and_time_func(func):
 2     def name_time(*param):
 3         start_time = datetime.datetime.now()
 4         print '<function name: %s>', func.__name__
 5         print '<function call begin>'
 6         func(*param)
 7         print '<function call end>'
 8         time.sleep(1)  # 可以不加,但是不加的話看不出來時間間隔
 9         print '[time costs: %s]', datetime.datetime.now() - start_time
10     return name_time
11 
12 @name_and_time_func
13 def hello(name):
14     print "hello, %s" % name
15 
16 hello('apple')

 

4. 寫一個函數, 將駝峰命名法字符串轉成下划線命名字符串,如GetItem -> get_item,getItem -> get_item

開始不知道該怎么做,就寫了個循環,挨個字符處理,如果是大寫,就改成下划線+小寫的形式。但是覺得這么寫實在是太low了。群里同學指點用sed,然而我只是要練習python啊又不是玩shell。后來在網上查了查re.sub的用法。之前不太會用,以為只能則匹配到的字符串替成同一個字符串。查過才知道原來第二個參數可以用函數或者lambda表達式對匹配到的字符串逐一替換。有了這個強大的武器可就方便多了。

1 def camel_name(name):
2     _name = re.sub('[A-Z]', lambda x: '_' + x.group(0).lower(), name)
3     return _name if _name[0] != '_' else _name[1:]  # 替換完之后有可能第一個字母是下划線,需要去掉
4 
5 names = ['GetItem', 'getItem', 'getitem']
6     for i in names:
7         print camel_name(i)

 

5. 打印列表:[1, 2, 3, 4...n],n=20;請編寫代碼打印如下規律的輸出:

        1 [1*, 2, 3, 4, 5]
        2 [1, 2*, 3, 4, 5]
        3 [1, 2, 3*, 4, 5]
        4 [2, 3, 4*, 5, 6]
        5 [3, 4, 5*, 6, 7]
        6 [4, 5, 6*, 7, 8]
        ...
        20 [16, 17, 18, 19, 20*]

 

差不多就是網頁中的翻頁格式吧。這個也沒有太大難度,不過我還是小卡一下,主要是強迫症犯了,想把這個改成更通用一點的形式。調了幾次之后效果還是不錯的,總頁數和顯示出來的頁碼數量可以自己傳參數,*頁碼總會出現在中間。當頁碼大於總頁數或小於1的時候也會自行調整。

 1 def page_print(page, total=20, width=5):
 2     # page是當前頁碼,就是標*的頁碼
 3     # total是總頁碼
 4     # width是顯示的頁數(*頁碼會出現在中間)
 5 
 6     # 設置打印頁碼,避免超出范圍
 7     if page < 1:
 8         page = 1
 9     if page > total:
10         page = total
11 
12     # 設置起始頁碼
13     if page < width / 2 + 1:
14         start = 1
15     elif page > total - width / 2:
16         start = total - width
17     else:
18         start = page - width / 2
19 
20     ret = str(page) + '['
21     for i in xrange(start, start + width + 1):
22         if i == page:
23             ret += '*'
24         ret += str(i)
25         if i != start + width:
26             ret += ', '
27         else:
28             ret += ']\n'
29 
30 return ret
31 
32 t = 18
33 for i in xrange(1, t + 1):
34     print page_print(page=i, total=t, width=8)

 

6. 寫一個程序模擬銀行排隊, 只有一個隊伍, 一個用戶進入時允許插隊(進入隊伍任意位置), 但要保證每次導致隊伍變更, 隊伍中受影響的人都收到通知

Customer A line up at position 11
Customer B: order changed to 12
Customer C: order changed to 13
Customer D: order changed to 14

不會。感覺像是某個設計模式的東西,我對設計模式了解的不多,暫時沒想到什么好辦法。強行寫是能寫的,不過程序寫出來肯定會很丑。等有空再想想(潛台詞是懶得動腦了)。

 

7. 用戶系統, 存在相互關注的動作, 當進入某個人的個人主頁, 需要展示其粉絲數, 關注數, 粉絲列表以及關注列表. 請簡要描述解決方案, 包括db建模/數據層/業務層, 以及應對高並發/關注取關等情況的處理邏輯。

略。

 

8. 給定一些NxN的矩陣,對於任意的路線,定義其【和】為其線路上所有節點的數字的和,計算從左上角到右下角的路線和最小值。每條路線只能從某一點到其周圍(上下左右)的點,不可斜行。 例如,

4,6
2,8 的路線和最小值為 4-2-8 14
1,2,3
4,5,6
7,8,9 的路線和最小值為 1-2-3-6-9 21

程序只需輸出最小和值即可(一個數字)

這是典型的動態規划問題啊。當年學動態規划時候,算法導論書上的第一個例子流水線問題就是這個東西。不過然而但是可是,動態規划我幾乎忘光了。先放在這里,過幾天寫篇日志補上。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM