目錄
1、lambda函數(匿名函數)
python使用lambda來創建匿名函數。
- lambda函數只是一個表達式,函數體比def簡單很多
- lambda語句被用來創建新的函數對象,並且在運行時返回他們。
- lambda會返回一個函數對象,但這個對象不會賦給一個標識符,而def則會把函數對象賦值
給一個 變量(函數名)。
- lambda函數擁有自己的命名空間,且不能訪問自有參數列表或者全局命名空間裏的參數
- 像if或for或print等語句不能用於lambda中。
示例1:
>>> sum=lambda x,y:x+y
>>> print(sum(10,11))
21
>>> print(sum("hello","world"))
helloworld
>>>
>>>
>>> a=lambda x,y,z:x+y*z
>>> a(1,2,3)
7
>>>
>>> a=lambda:1
>>> a
<function <lambda> at 0x00000227F332B378>
>>> a()
1
>>>
示例2:自定義一個函數和lambda一起使用
>>> def twice(n):
... return lambda s:s*n
...
>>> #該步的作用是t=lambda s:s*n, 且n=2
...
>>> t=twice(2)
>>> #下面是將s傳遞進去,s爲“word”
...
>>> print(t("word"))
wordword
>>>
2、map函數:根據指定序列做映射
map函數會根據指定的序列做映射
語法
map(function,iterable,...)
- function:函數
- iterable:一個或者多個序列
返回值
- Python2中返回列表
- Python3中返回迭代器,如果想生成列表,要list()下。
示例1:用map函數求列表中各個數的二次方
>>> def square_1(x):
... return x**2
...
>>> map(square_1,[1,2,3,4])
<map object at 0x00000227F33322E8>
>>> list(map(square_1,[1,2,3,4]))
[1, 4, 9, 16]
>>>
示例2:用map函數求2個列表中的對應位上的數值相加
>>> res=map(lambda x,y:x+y,[2,3,4],[3,4,5])
>>> print(list(res))
[5, 7, 9]
>>>
示例3:用map函數將字符串中的數字轉換爲數字類型,其他類型不變。
>>> def get_num(s):
... if s>="0" and s<="9":
... return int(s)
... else:
... return s
...
>>> print(list(map(get_num,"abc123")))
['a', 'b', 'c', 1, 2, 3]
>>>
解釋:
map函數是將序列字符串“abc123”中的每個元素都用函數get_num進行判斷,所以在get_num只要就是用於判斷序列中每個元素需要滿足的要求就行。
3、reduce函數:
3.1、自定義函數和reduce配合使用
語法
reduce(function,iterable[,initializer])
- function:函數,有2個參數
- iterable:可迭代對象
- initializer:可選,初始參數
注意事項:
1、在python2中reduce()函數可以直接使用,但是在python3中,reduce()需要引入模塊:functools
示例1:
>>> from functools import reduce
>>>
>>> def add(a,b):
... return a+b
...
>>> reduce(add,[3,4,5,6,7])
25
>>>
思路解析:
前兩個數值相加:
3+4=7
和7與第三個值相加:
7+5=12
和12和第4個數值相加
12+6=18
和18與第5個值相加
18+7=25
3.2、與lambda函數混合使用
注意事項:
reduce中,函數必須是2個參數,不能是1個,否則會報錯。
示例1:
>>> reduce(lambda x:x*2,[1,2,3,4])
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: <lambda>() takes 1 positional argument but 2 were given
>>>
示例2:統計某個字符串中某個字符的重複次數。
>>> from functools import reduce
>>> sentence="i am a boy,i have a ball"
>>> print(reduce(lambda a,x:a+x.count("a"),sentence,0))
5
>>>
4、filter函數
filter()函數用於過濾序列,過濾掉不符合條件的元素,返回由符合條件元組組成的列表。
該函數接受兩個參數,第一個爲函數,第二個爲序列,序列的每個元素傳給函數進行判斷,返回True和False,最後將True的元素放在列表中。
注意:python3中返回的是迭代器,如果需要,可以轉換爲列表。
示例1:返回列表中的奇數或者偶數
>>> def is_odd(n):
... if n%2==1:
... return n
...
>>> print(list(filter(is_odd,(1,2,3,4,5,6,7))))
[1, 3, 5, 7]
>>> print(list(filter(lambda x:x%2==0,(2,3,4,5,6,7,8,9,10))))
[2, 4, 6, 8, 10]
>>>
5、推導列表
列表推導式提供了一種簡明扼要的方法來創建列表。
習題1:使用列表推導式實現嵌套列表的平鋪。
>>> s=[[1,2,3],[4,5,6],[7,8,9]]
>>> print([k for i in s for k in i])
[1, 2, 3, 4, 5, 6, 7, 8, 9]
>>>
習題2:使用推導列表過濾掉不符合條件的元素
>>> m
[0, 2, 3, 4, -1, -4, -2, -5, 9]
>>> print([num for num in m if num>0] )
[2, 3, 4, 9]
>>>
習題3:在列表推導式中使用多個循環,實現多序列元素任意組合
>>> [(x,y) for x in range(5) for y in range(10) if y>4]
[(0, 5), (0, 6), (0, 7), (0, 8), (0, 9), (1, 5), (1, 6), (1, 7), (1, 8), (1, 9), (2, 5), (2, 6), (2, 7), (2, 8), (2, 9), (3, 5), (3, 6), (3, 7), (3, 8), (3, 9), (4, 5), (4, 6), (4, 7), (4, 8), (4, 9)]
>>>
習題4、使用推導列表列出100以內的所有的素數。
>>> import math
>>> math.sqrt(100)
10.0
>>> [n for n in range(2,100) if 0 not in [n%d for d in range(2,int(math.sqrt(n))+1)]]
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]
>>>
6、切片
python中的有序序列都可以進行切片操作,例如:列表、元組、字符串
語法:
序列[start:end:step]
- start:起始索引,從0開始,-1結束
- end:結束索引
- step:步長
- end-start:當爲正數時,從左向右取值,當爲負數時,反向取值。
- 切片結果不包含結束索引,不包含最後一位。
-
>>> list1=[1,2,3,4,5,6,7] >>> list2=list1[:] >>> list2 [1, 2, 3, 4, 5, 6, 7] >>> list3=list1[::1] >>> list3 [1, 2, 3, 4, 5, 6, 7] >>> list4=list1[2:6:2] >>> list4 [3, 5] >>> list5=list1[:-1:1] >>> list5 [1, 2, 3, 4, 5, 6] >>> list6=list1[-4:-1:2] >>> list6 [4, 6] >>> list7=list1[-1:0:1] >>> list7 [] >>> list8=list1[-1:0:-1] >>> list8 [7, 6, 5, 4, 3, 2] >>>