国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

初學Python函數的筆記整理

2019-11-25 17:50:05
字體:
來源:轉載
供稿:網友

 定義
返回單值

def my_abs(x):  if x >= 0:    return x  else:    return -x 

返回多值

返回多值就是返回一個tuple

import math def move(x, y, step, angle=0):  nx = x + step * math.cos(angle)  ny = y - step * math.sin(angle)  return nx, ny

空函數
 

def nop():  pass

指定默認參數

必選參數在前,默認參數在后。默認參數需指向不可變對象(默認參數值在函數定義時被計算)
 

def power(x, n=2):  s = 1  while n > 0:    n = n - 1    s = s * x  return s

可變參數
 

def calc(*numbers):  sum = 0  for n in numbers:    sum = sum + n * n  return sum

調用可變參數的函數方法
 

>>> calc(1, 2)5>>> calc()0>>> nums = [1, 2, 3]>>> calc(*nums)14

關鍵字參數
 

def person(name, age, **kw):  print 'name:', name, 'age:', age, 'other:', kw

調用關鍵字參數的方法
 

>>> person('Michael', 30)name: Michael age: 30 other: {}>>> person('Bob', 35, city='Beijing')name: Bob age: 35 other: {'city': 'Beijing'}>>> person('Adam', 45, gender='M', job='Engineer')name: Adam age: 45 other: {'gender': 'M', 'job': 'Engineer'}>>> kw = {'city': 'Beijing', 'job': 'Engineer'}>>> person('Jack', 24, **kw)name: Jack age: 24 other: {'city': 'Beijing', 'job': 'Engineer'}

注:

    參數定義的順序必須是:必選參數、默認參數、可變參數和關鍵字參數。
    對于任意函數,都可以通過類似func(*args, **kw)的形式調用它,無論它的參數是如何定義的。

遞歸

如果一個函數在內部調用自身本身,這個函數就是遞歸函數。
尾遞歸

在函數返回的時候,調用自身本身,并且,return語句不能包含表達式。
高階函數

  •     變量可以指向函數(函數可以賦值給一個變量)
  •     函數名也是變量(函數名可以賦值其他值)
  •     函數可以做為函數的參數(高階函數)

map(func, list)

map()函數接收兩個參數,一個是函數,一個是序列,map將傳入的函數依次作用到序列的每個元素,并把結果作為新的list返回。
 

>>> def f(x):...   return x * x...>>> map(f, [1, 2, 3, 4, 5, 6, 7, 8, 9])[1, 4, 9, 16, 25, 36, 49, 64, 81]
reduce(func_with_two_params, list)

reduce把一個函數作用在一個序列[x1, x2, x3…]上,這個函數必須接收兩個參數,reduce把結果繼續和序列的下一個元素做累積計算。
 

reduce(f, [x1, x2, x3, x4])#相當于:f(f(f(x1, x2), x3), x4) >>> def add(x, y):...   return x + y...>>> reduce(add, [1, 3, 5, 7, 9])25

filter(func_return_bool, list)

把傳入的函數依次作用于每個元素,然后根據返回值是True還是False決定保留還是丟棄該元素。
 

def is_odd(n):  return n % 2 == 1 filter(is_odd, [1, 2, 4, 5, 6, 9, 10, 15])# 結果: [1, 5, 9, 15]

sorted

對于兩個元素x和y,如果認為x < y,則返回-1,如果認為x == y,則返回0,如果認為x > y,則返回1,
 

>>> sorted([36, 5, 12, 9, 21])[5, 9, 12, 21, 36]

高階函數用法
 

def reversed_cmp(x, y):  if x > y:    return -1  if x < y:    return 1  return 0 >>> sorted([36, 5, 12, 9, 21], reversed_cmp)[36, 21, 12, 9, 5]

函數做為返回值
 

def lazy_sum(*args):  def sum():    ax = 0    for n in args:      ax = ax + n    return ax  return sum >>> f = lazy_sum(1, 3, 5, 7, 9)>>> f<function sum at 0x10452f668>>>> f()25

注:每次調用lazy_sum()都會返回一個新的函數,即使傳入相同的參數。
閉包
 

def count():  fs = []  for i in range(1, 4):    def f():       return i*i    fs.append(f)  return fs f1, f2, f3 = count()>>> f1()9>>> f2()9>>> f3()9

原因是調用count的時候循環已經執行,但是f()還沒有執行,直到調用其時才執行。所以返回函數不要引用任何循環變量,或者后續會發生變化的變量。
匿名函數(lambda表達式)
 

等價于:
 

def f(x):  return x * x

關鍵字lambda表示匿名函數,冒號前面的x表示函數參數。
匿名函數做為返回值
 

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

裝飾器(@func)

在代碼運行期間動態增加功能的方式,稱之為“裝飾器”(Decorator),本質上,decorator就是一個返回函數的高階函數。
 

def log(func):  def wrapper(*args, **kw):    print 'call %s():' % func.__name__    return func(*args, **kw)  return wrapper @logdef now():  print '2013-12-25' >>> now()call now():2013-12-25 #相當于執行: now = log(now)回到頂部帶參數的裝飾器 def log(text):  def decorator(func):    def wrapper(*args, **kw):      print '%s %s():' % (text, func.__name__)      return func(*args, **kw)    return wrapper  return decorator @log('execute')def now():  print '2013-12-25' #執行結果>>> now()execute now():2013-12-25 #相當于執行: >>> now = log('execute')(now)

剖析:首先執行log('execute'),返回的是decorator函數,再調用返回的函數,參數是now函數,返回值最終是wrapper函數。

__name__
由于函數的__name__已經改變,依賴于此的代碼就會出錯。因此使用functools.wraps。
 
import functools def log(func):  @functools.wraps(func)  def wrapper(*args, **kw):    print 'call %s():' % func.__name__    return func(*args, **kw)  return wrapper #對于帶參函數 import functools def log(text):  def decorator(func):    @functools.wraps(func)    def wrapper(*args, **kw):      print '%s %s():' % (text, func.__name__)      return func(*args, **kw)    return wrapper  return decorator
偏函數(固定函數默認值)
 
>>> import functools>>> int2 = functools.partial(int, base=2)>>> int2('1000000')64>>> int2('1010101')85 #相當于: def int2(x, base=2):  return int(x, base) max2 = functools.partial(max, 10)

相當于為max函數指定了第一個參數
 

max2(5, 6, 7) #相當于: max(10, 5, 6, 7)

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 龙陵县| 岑溪市| 阳新县| 棋牌| 辉县市| 中卫市| 宜宾县| 三门县| 铜川市| 鸡西市| 揭西县| 大渡口区| 大城县| 凤山县| 屯留县| 光山县| 苍溪县| 宁蒗| 宜兰市| 平遥县| 宜宾县| 茂名市| 紫金县| 永川市| 广灵县| 缙云县| 社旗县| 阜南县| 新泰市| 开封县| 莒南县| 花莲县| 内乡县| 辽宁省| 巫山县| 肇源县| 寿宁县| 长岛县| 泸定县| 临夏市| 五台县|