python3---六劍客

目錄

 

1、lambda函數(匿名函數)

2、map函數:根據指定序列做映射

3、reduce函數:

3.1、自定義函數和reduce配合使用

3.2、與lambda函數混合使用

4、filter函數

5、推導列表

6、切片


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]
    >>>

     

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章