python筆記2(函數)

一、 函數

在交互式命令行通過help(函數名)查看函數的幫助信息

1 基本函數

  • print()函數

    print()

    print會依次打印每個字符串,遇到逗號“,”會輸出一個空格,print自動換行

  • input()函數

    input(),input輸入的是str類型的

    a = input('name:')會輸出提示信息

  • int()函數

    數據類型轉換,將str轉換爲整數

    例:b = int(s)

  • abs函數

    求絕對值

  • max()函數

    可以接收任意多個參數,並返回最大的

  • hex()函數

    把一個整數轉換成十六進制表示的字符串

  • range()函數

    可以生成一個整數序列,從0開始生產

    list()函數可以轉換爲list

    print(list(range(5)))

  • isinstance函數

    可以判斷一個變量是不是什麼

    isinstance(x, ...)

  • sum函數

    可以直接求和

2 定義函數

  1. 使用def語句,依次寫出函數名、括號、括號中的參數和冒號:

  2. 在縮進塊中編寫函數體,函數的返回值用return語句返回

    def my_abs(x):

(1)定義一個空函數:

pass語句

例:def nop():
pass

(2)函數的參數

1.位置參數:

  • 調用函數時,傳入的兩個值按照位置順序依次賦給參數

    例:def power(x):

2.默認參數:

  • 必選參數在前,默認參數在後

  • 當函數有多個參數時,把變化大的參數放前面,變化小的參數放後面。變化小的參數就可以作爲默認參數

  • 可以按順序提供默認參數

  • 可以不按順序提供部分默認參數,但需將參數名加上

    默認參數必須指向不變對象

    例:def enroll(name, gender, age=6, city='Beijing'):

3.可變參數:

  • *args是可變參數,args接收的是一個tuple

  • *nums表示把nums這個list的所有元素作爲可變參數傳進去

  • 可變參數允許你傳入0個或任意個參數,這些可變參數在函數調用時自動組裝爲一個tuple

  • 可變參數既可以直接傳入:func(1, 2, 3),又可以先組裝list或tuple,再通過*args傳入:func(*(1, 2, 3))

    例:def calc(*numbers):

4.關鍵字參數:

  • **kw是關鍵字參數,kw接收的是一個dict

  • 關鍵字參數允許傳入0個或任意個含參數名的參數,這些關鍵字參數在函數內部自動組裝爲一個dict

  • 可以擴展函數的功能

  • 函數的調用者可以傳入任意不受限制的關鍵字參數

  • 關鍵字參數既可以直接傳入:func(a=1, b=2),又可以先組裝dict,再通過**kw傳入:func(**{'a': 1, 'b': 2})

    例:def person(name, age, **kw):

5.命名關鍵字參數

  • 命名的關鍵字參數是爲了限制關鍵字參數,同時可以提供默認值(可以有缺省值)。
  • *後面的是命名關鍵字參數,如果已經有了可變參數,就不需要再加一個*
  • 命名關鍵字必須傳入參數名
  • 每一個命名關鍵字參數都必須有值
  • 定義命名的關鍵字參數在沒有可變參數的情況下不要忘了寫分隔符*,否則定義的將是位置參數。

6.參數組合

  • 參數定義的順序必須是:位置參數、默認參數、可變參數(*)、命名關鍵字參數(*)和關鍵字參數(**)
(3)參數檢查

數據類型檢查可以用內置函數isinstance()實現

if not isinstance(x, (int, float)):
raise TypeError('bad operand type')

(4)返回多個值(返回tuple)

Python的函數返回多值其實就是返回一個tuple

返回一個tuple可以省略括號,而多個變量可以同時接收一個tuple,按位置賦給對應的值

二、高級特性


1、切片

L[起始索引:結束索引:間隔大小],若第一個索引爲0,可省略;若間隔大小爲1,可省略;可以全部省略,則爲複製

L[0:3]:0 <= L < 3 (不包含3)

可對list、tuple、字符串進行切片,靈活

支持倒數切片

2、迭代Iteration

for循環來遍歷這個list或tuple,這種遍歷我們稱爲迭代(Iteration)

在Python中,迭代是通過for ... in來完成的

dict的儲存不是按照list的方式順序排列的,迭代出的結果順序可能不一樣

dict迭代:

  • 默認情況下,dict迭代的是key
  • 如果要迭代value,可以用for value in d.values()
  • 如果要同時迭代key和value,可以用for k, v in d.items()

如何判斷一個對象是可迭代對象呢?

方法是通過collections模塊的Iterable類型判斷:

from collections import Iterable
isinstance('abc', Iterable)

Python內置的enumerate函數可以把一個list變成索引-元素對,這樣就可以在for循環中同時迭代索引和元素本身:

 for i, value in enumerate(['A', 'B', 'C']):
     print(i, value)

任何可迭代對象都可以作用於for循環,包括我們自定義的數據類型,只要符合迭代條件,就可以使用for循環

3、列表生成式

用來創建list的生成式

for循環創建list的生成式

[x * x for x in range(1, 11)]

4、生成器generator

這種一邊循環一邊計算的機制,稱爲生成器:generator

  • 創建一個generator
    • 1、方法很簡單,只要把一個列表生成式的[]改成()
    • 2、函數定義中包含yield關鍵字,那麼這個函數是一個generator

generator的函數,在每次調用next()的時候執行,遇到yield語句返回,再次執行時從上次返回的yield語句處繼續執行

  • 調用

    調用generator時,首先要生成一個generator對象,然後用next()函數不斷獲得下一個返回值

  • 返回值

    for循環調用generator時,發現拿不到generator的return語句的返回值。如果想要拿到返回值,必須捕獲StopIteration錯誤,返回值包含在StopIterationvalue中:

  • 結束

    對於函數改成的generator來說,遇到return語句或者執行到函數體最後一行語句,就是結束generator的指令,for循環隨之結束。

5、迭代器Iterator

  • 可以直接作用於for循環的數據類型有:

    • list、tuple、dict、set、str
    • generator(包括生成器和帶yield的函數)
  • 可以直接作用於for循環的對象統稱爲可迭代對象Iterable

    • 可以使用isinstance()判斷一個對象是否是Iterable對象

    • from collections import Iterable

      例:

      from collections import Iterable

      isinstance([], Iterable)

  • next()函數調用並不斷返回下一個值的對象稱爲迭代器Iterator

    • 可以使用isinstance()判斷一個對象是否是Iterator對象

      例:

      from collections import Iterator

      isinstance((x for x in range(10)), Iterator)

  • 使用iter()list、dict、strIterable變成Iterator

三、函數式編程


1、高階函數

函數就是面向過程的程序設計的基本單元

函數本身也可以賦值給變量,即:變量可以指向函數

函數名其實就是指向函數的變量

高階函數:一個函數就可以接收另一個函數作爲參數

  • map/reduce

    • map(兩個參數)

      map函數接受兩個參數,一個函數,一個是Iterable,map將傳入的函數依次作用到序列的每個元素,並把結果作爲新的Iterable放回

      Iterator是惰性序列,通過list()函數讓它把整個序列都計算出來並返回一個list

    • reduce(兩個參數)

      把一個函數作用在一個序列[x1,x2,x3,x4......]

      這個函數必須接受兩個參數,reduce把結果繼續和下一個元素做累計計算

      reduce(f,[x1,x2,x3,x4]) = f(f(f(x1,x2),x3),x4)

  • filter:過濾序列(兩個參數)

    接收一個函數與一個序列,與map類似依次作用於每個元素,但根據返回值確定是否丟棄元素

    返回值也是一個Iterator(惰性序列),需要list函數獲取結果並返回list

  • sorted:排序算法(三個參數)

    可以接收一個key函數來實現自定義的排序

    例:sorted([3,65,3,4],key=abs)

    忽略大小寫:

    sorted(['bob', 'about', 'Zoo', 'Credit'], key=str.lower)

    進行反向排序,傳入第三個參數reverse=True

    sorted(['bob', 'about', 'Zoo', 'Credit'], key=str.lower, reverse=True)

2、返回函數

相關參數和變量都保存在返回的函數中,稱爲“閉包”

每次調用互不影響

返回的函數不會立刻執行

返回函數不要引用任何循環變量,或者後續會發生變化的變量,如果使用的話,多次調用的結果會相同

3、匿名函數(lambda

關鍵字lambda表示匿名函數,冒號前面的x表示函數參數

list(map(lambda x: x * x, [1, 2, 3, 4, 5, 6, 7, 8, 9]))

匿名函數只能有一個表達式,不用寫return,返回值就是該表達式的結果

匿名函數不會衝突

匿名函數也是一個函數對象,可以把匿名函數賦值給一個變量,也可以吧匿名函數作爲返回值返回

def build(x, y): return lambda: x * x + y * y

4、裝飾器(@

在代碼運行期間增加功能的方式,稱爲“裝飾器”(Decorator)

函數有一個__name__可以拿到函數的名字

functools.wrap<==>wrapper.__name__ = func.__name__(交換函數簽名)

一個完整的decorator:

import functools

def log(func):
	@functools.warps(func)

5、偏函數(functools.partial

偏函數(Partial function):把一個函數的某些參數固定

functools.partial創建一個偏函數,給一個函數設定默認參數(在函數調用的時候也可以傳入其他值),返回一個新函數

int2 = functools.paratial(int,base=2)

創建偏函數的時候,可以接收函數對象*args**kw

四、 模塊


作用域

  • 公開(public):正常的函數和變量名,可以被直接引用
  • 特殊變量:__xxx__,定義自己的變量一般不用
  • 私有(private):_xxx__xxx,不應該直接引用private函數
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章