1. 程式人生 > >python進階系列學習(一)

python進階系列學習(一)

map函式

map函式是python的內建的高階函式,接受兩個引數,第一個就是函式f,另一個就是列表list,作用就是f函式作用於list的每一個元素,這裡需要注意的一點是map()函式作用於一個list時,會返回一個新的list,並不會改變原有的list

在做課後習題時
題目:
假設使用者輸入的英文名字不規範,沒有按照首字母大寫,後續字母小寫的規則,請利用map()函式,把一個list(包含若干不規範的英文名字)變成一個包含規範英文名字的list:

輸入:[‘adam’, ‘LISA’, ‘barT’]
輸出:[‘Adam’, ‘Lisa’, ‘Bart’]

出現一個問題:

 def f(s):
...
s[0]=s[0].upper() ... return s ... >>> f('xuanxuan') Traceback (most recent call last): File "<stdin>", line 1, in <module> File "<stdin>", line 2, in f TypeError: 'str' object does not support item assignment

原因就是,字串是不可變物件,不要試圖通過下標索引賦值的方式去改變原來字串的值!
解決辦法:

def
format_name(s):
s1=s[0].upper()+s[1:].lower() return s1 print map(format_name, ['adam', 'LISA', 'barT'])

也就是說map()函式的返回值是一個新的list,該返回值是由函式f作用於list的每一個元素得到的

reduce函式

reduce()函式也是python內建的高階函式,和map函式一樣,也是需要接收兩個引數,第一個引數就是要作用的函式f,另一個引數就是list,只不過和map函式不同的是,該函式f必須的接收兩個引數!其實reduce函式有點類似於對每一個元素反覆的使用f,前後相關,且有累計效應~
題目:

Python內建了求和函式sum(),但沒有求積的函式,請利用recude()來求積:

輸入:[2, 4, 5, 7, 12]
輸出:2*4*5*7*12的結果

def prod(x, y):
    return x*y

print reduce(prod, [2, 4, 5, 7, 12])

filter函式

filter函式也是python內建的高階函式,也是接收兩個引數,第一個引數是函式f,另一個引數是list,引數中的filter函式返回的是一個Ture 或者False型別的,當把該
函式作用於list中的每一個元素時,保留值為True的元素,去掉不滿足條件的,將滿足條件的元素,以一個新的list返回~

該filter函式可以用於返回一個數組中字串為空,或者元素為None的元素:
這時候filter中引數f的功能就是得寫一個函式,他可以判斷該元素不是None且不是空的字元

>>> def is_not_empty(s):
...     return s and len(s.strip())>0
...
>>>

接下來就可以使用filter函式去掉陣列中不滿足條件的元素,返回一個新的list

>>> print(filter(is_not_empty,['','as','   ha','  ',None]))

結果為:

['as', '   ha']   #輸出的結果

這裡需要補充一個知識點strip()函式
s.strip(rm) 可以用於去除s字串中開頭和結尾的rm序列(如果有的話),rm為空時,預設刪除空白符,包括‘\n’,’\r’,’\t’, 例如:

>>> s='  0sd1  '
>>> s.strip()
'0sd1'
>>>

題目:
請利用filter()過濾出1~100中平方根是整數的數,即結果應該是:

[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

解法一(我自己寫的):

import math

def is_sqr(x):
    return math.sqrt(x) in range(1,51)

print filter(is_sqr, range(1, 101))

解法二(別人的解法,更好):

import math
def is_sqr(x):
    r=int(math.sqrt(x))
    return r*r==x
print(filter(is_sqr,range(1,101)))