-
map函數(shù),批量計算數(shù)據(jù)
Paste_Image.png
list(map(str, [1, 2, 3, 4, 5, 6, 7, 8, 9]))
['1', '2', '3', '4', '5', '6', '7', '8', '9']
Python中轉變大小寫的直接函數(shù)有以下方法:
upper()——所有字母大寫
lower()——所有字母小寫
capitalize()——首字母大寫,其他字母小寫
title()——所有單詞首字母大寫,其他小寫
def normalize(name):
return str.capitalize(name)
L1 = ['adam', 'LISA', 'barT']
L2 = list(map(normalize, L1))
print(L2)
reduce函數(shù),計算結果不斷迭代
filter 過濾函數(shù)
注意到filter()函數(shù)返回的是一個Iterator,也就是一個惰性序列,所以要強迫filter()完成計算結果,需要用list()函數(shù)獲得所有結果并返回list。
def NumIsOdd(Num):
return Num%2==1
# list后面的括號是類型轉化用的
print(list(filter(NumIsOdd,[1,2,3,4,5])))
- 打印素數(shù)
計算素數(shù)的一個方法是埃氏篩法,它的算法理解起來非常簡單:
首先,列出從2開始的所有自然數(shù),構造一個序列:
2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, ...取序列的第一個數(shù)2,它一定是素數(shù),然后用2把序列的2
的倍數(shù)篩掉:3,4, 5,6, 7,8, 9,10, 11,12, 13,14, 15,16, 17,18, 19,20, ...
取新序列的第一個數(shù)3,它一定是素數(shù),然后用3把序列的3的倍數(shù)篩掉:5,6, 7,8,9,10, 11,12, 13,14,15,16, 17,18, 19,20, ...取新序列的第一個數(shù)5,然后用5把序列的5的倍數(shù)篩掉:7,8,9,10, 11,12, 13,14,15,16, 17,18, 19,20, ...不斷篩下去,就可以得到所有的素數(shù)。
# 生成器
def _odd_iter():
n=1
while True:
n = n + 2
yield n
# 刷選函數(shù)
def _not_divisible(n):
return lambda x : x % n > 0
# 定義一個生成器,不斷地返回下一個素數(shù)
def primes():
yield 2
it = _odd_iter() # 初始化奇數(shù)序列
while True:
n = next(it)
yield n
it = filter(_not_divisible(n),it) # 構造新序列
# 打印1000以內(nèi)的素數(shù):
for n in primes():
if n < 1000:
print(n)
else:
break
- 回數(shù)是指從左向右讀和從右向左讀都是一樣的數(shù),例如12321,909。請利用filter()濾掉非回數(shù):
def is_palindrome(n):
return str(n)==str(n)[::-1]
output = filter(is_palindrome, range(1, 1000))
print(list(output))
- 為什么以下可以刪除空字符?
strip函數(shù)會去掉字符串頭尾指定的字符,默認為空格,返回的是生成的新字符串;若下面的字符中是空字符,那么去掉后就是空了,and之后就為False。
def not_empty(s):
return s and s.strip()
list(filter(not_empty, ['A', '', 'B', None, 'C', ' ']))
# 結果: ['A', 'B', 'C']
- sorted函數(shù)
假設我們用一組tuple表示學生名字和成績,對齊用成績進行排序
def by_name(t):
return t[1]
L = [('Bob', 75), ('Adam', 92), ('Bart', 66), ('Lisa', 88)]
L2 = sorted(L, key=by_name)
print(L2)
函數(shù)返回一個函數(shù)的時候,每次都會返回一個新的函數(shù)
裝飾器解釋
Python裝飾器為什么難理解?
理解 Python 裝飾器看這一篇就夠了
[Python]寫個帶參數(shù)的裝飾器
def log(func):
def wrapper(*args, **kw):
print('call %s():' % func.__name__)
return func(*args, **kw)
return wrapper
@log
def now():
print('2015-3-25')
返回
>>> now()
call now():
2015-3-25
調(diào)用now的時候,實際上是調(diào)用log,然后以now作為參數(shù)。
調(diào)用log后,看到只定義了并返回了函數(shù)wrapper,就調(diào)用了wrapper,wrapper第一句打印函數(shù)的名字,還是now,接下來,wrapper返回func的調(diào)用,也就是now真正執(zhí)行了。
如果decorator本身需要傳入?yún)?shù),那就需要編寫一個返回decorator的高階函數(shù),寫出來會更復雜。比如,要自定義log的文本:
def log(text):
def decorator(func):
def wrapper(*args, **kw):
print('%s %s():' % (text, func.__name__))
return func(*args, **kw)
return wrapper
return decorator
這個3層嵌套的decorator用法如下:
@log('execute')
def now():
print('2015-3-25')
執(zhí)行結果如下:
>>> now()
execute now():
2015-3-25
調(diào)用now的時候,實際上執(zhí)行函數(shù)log,返回decorator的執(zhí)行,返回wrapper的執(zhí)行,wrapper執(zhí)行就是結果了。
- @property,將設置屬性變得更加簡單,這里實際上是一個修飾器,跟修飾器的代碼比較下。
class Screen(object):
@property
def width(self):
return self._width
@width.setter
def width(self, val):
self._width = val
@property
def height(self):
return self._height
# test:
s = Screen()
s.width = 1024
#can't allowed!!
# s.height = 768
print(s.width, s.height)
- Python內(nèi)置的logging模塊可以非常容易地記錄錯誤信息:
# err_logging.py
import logging
def foo(s):
return 10 / int(s)
def bar(s):
return foo(s) * 2
def main():
try:
bar('0')
except Exception as e:
logging.exception(e)
main()
print('END')
- if name == 'main':的作用是什么?
運行第一個模塊的時候,模塊內(nèi)建的變量name是‘main’,而其他次序運行的name就是模塊的名字,因此這個判斷直接的作用就是判斷模塊是不是首先被執(zhí)行,或者是被首先執(zhí)行的模塊import的。
