1.final作用域的代碼一定會被執行嗎?
正常的情況下,finally作用域的代碼一定會被執行的,不管是否發生異常。哪怕是調用了sys.exit函數,finally也是會被執行的,那怎麼樣才能讓finally代碼不執行了。
import time
choice = True
try:
if choice:
while True:
pass
else:
print "Please pull the plug on your computer sometime soon..."
time.sleep(60 * 60 * 24 * 365)
finally:
print "Finally ..."
上面的代碼主要是通過讓流程停滯在try作用域裏,從而實現了需求。上面的代碼不排除有點投機取巧的意思,但是我們實習了題目的需求不是嗎。
2.可以對含有任意的元素的list進行排序嗎?
正常情況下:
>>> a = [1, '2', '3', '1']
>>> a.sort()
>>> a
[1, '1', '2', '3']
那是不是以爲着,任何list都可以調用sort函數進行排序了?
'''
遇到問題沒人解答?小編創建了一個Python學習交流QQ羣:579817333
尋找有志同道合的小夥伴,互幫互助,羣裏還有不錯的視頻學習教程和PDF電子書!
'''
>>> x = [1, 1j]
>>> x.sort()
Traceback (most recent call last):
File "<pyshell#13>", line 1, in ?
x.sort()
TypeError: cannot compare complex numbers using <, <=, >, >=
python裏1j是一個特殊符號代表-1的平方根,出現這個問題的原因是sort函數調用的對象的lt函數來比較兩個對象的,而複雜的數字類型是不可比較的,也就說沒有實現lt函數,所以比較不了。因此,對於list裏包含的對象如果都是可以比較的,也就是說實現了lt函數,那麼對list調用sort函數是沒問題的。
3.Python可是使用++x或者x++之類的操作嗎?
++x操作是可以的,但是這個操作產生的結果和C語言裏該操作產生的結果是不一樣的,Python裏++x操作裏的加好只是一個一元操作符,所以,++x等價於+(+x),所以++x == x。
x++操作是不合法的,雖然有些情況下,x++看着是合法的,比如:x+±y,但其實這個表達式等價於x+(+(-y)) = x-y,所以正常情況下,x++是不合法的。
4.Python裏如何實現類似於C++裏的cout<<x<<y操作?
實現的方法如下:
'''
遇到問題沒人解答?小編創建了一個Python學習交流QQ羣:579817333
尋找有志同道合的小夥伴,互幫互助,羣裏還有不錯的視頻學習教程和PDF電子書!
'''
import sys
class ostream:
def __init__(self, file):
self.file = file
def __lshift__(self, obj):
self.file.write(str(obj));
return self
cout = ostream(sys.stdout)
cerr = ostream(sys.stderr)
nl = '\n'
cout << x << " " << y << nl
這地方並不是展示了一個新的python語法,這只是對python的str對象進行了封裝。
5.Python裏如何實現C++裏的printf函數?
在python2中,print是一個表達式,python3裏是個函數。所以在python2裏,我們可以這麼做:
def printf(format, *args): print format % args,
上面的代碼雖然只有一行,但是,有些地方還是需要注意的。第一個地方,就是最後使用了都好結尾,這樣的話會更像c++的printf函數,如果想換行,則需要傳入換行符。第二個地方是這個代碼會在最後多打印一個空格,如果不想要這個空格,可以使用sys.stdout.write函數。第三的方面,這行代碼除了更像C++風格的printf,還有其他好處嗎?當然是有的,參數是比較靈活的。
6.Python裏逗號等號(,=)是什麼意思?
你可以能見過下面的代碼:
>>> x ,= range(1)
>>> x
0
實際上,沒有逗號等號(,=)這種操作符,上面的代碼等價於 (x,) = range(1)。
這只是一個賦值語句,在左邊有一個元組,意味着將元組的每個元素賦給右邊的相應元素; 在這種情況下,x被賦值爲0
7.下面的代碼是否意味着python裏有階乘的操作符?
比如下面的代碼:
assert 0!=1
assert 3!=6
assert 4!=24
assert 5!=120
其實上面的代碼並不是階乘的結果,只是有意的構造代碼的結果,實際上,上面的代碼等價於:
assert 0 != 1
assert 3 != 6
assert 4 != 24
assert 5 != 120
這樣一看,其實assert判斷是不等於的關係,所以都是True。
8.如何快速的給Python的對象增加屬性
通常我們的做法是,在對象定義的時候,定義相關的屬性,那如何自由的添加對象屬性了。
'''
遇到問題沒人解答?小編創建了一個Python學習交流QQ羣:579817333
尋找有志同道合的小夥伴,互幫互助,羣裏還有不錯的視頻學習教程和PDF電子書!
'''
class Struct:
"A structure that can have any fields defined."
def __init__(self, **entries): self.__dict__.update(entries)
>>> options = Struct(answer=42, linelen=80, font='courier')
>>> options.answer
42
>>> options.answer = 'plastics'
>>> vars(options)
{'answer': 'plastics', 'font': 'courier', 'linelen': 80}
9.如何定義一個包含默認值的dict
在python2.7之前,必須定義一個類來處理這樣的需求,現在,可以使用collections.defaultdict和collections.Counte來實現。
rom collections import Counter
words = 'this is a test this is only a test'.split()
>>> Counter(words)
Counter({'this': 2, 'test': 2, 'a': 2, 'is': 2, 'only': 1})
10.如何計算函數的執行時間
def timer(fn, *args):
"Time the application of fn to args. Return (result, seconds)."
import time
start = time.clock()
return fn(*args), time.clock() - start
>>> timer(max, range(1e6))
(999999, 0.4921875)
當然,python還有很多現成的輪子,可以更好的計算程序每個步驟的詳細信息。
11.如何實現單例模式
網上有很多方法,但是我知道的最簡單的方式如下:
def singleton(object):
"Raise an exception if an object of this class has been instantiated before."
cls = object.__class__
if hasattr(cls, '__instantiated'):
raise ValueError("%s is a Singleton class but is already instantiated" % cls)
cls.__instantiated = True
class YourClass:
"A singleton class to do something ..."
def __init__(self, args):
singleton(self)
...