1. 程式人生 > 其它 >python基礎——4.函式&內建函式

python基礎——4.函式&內建函式

1.函式是對動作或者功能的封裝;定義了之後可以在任何需要它的地方呼叫
2.返回值有三種情況:
沒有返回值
不寫return
只寫return,結束
return None 不常用

返回一個值
    可以返回任何資料型別
    只要返回舊可以接收到
    如果在一個程式中有多個return,只執行一個

返回多個值
    多個返回值用多個變數接收,有多少就用多少
    用一個變數接收多個返回值,得到的是元組

3.引數
沒有引數:函式和呼叫函式是括號裡不寫內容
有一個參:傳什麼是什麼
有多個參:位置引數

站在實參的角度上:
    1.位置引數:按位置傳         # 在最前
    2.關鍵字引數:按關鍵字傳      # 在位置後
    3.混合引數:可以混用,但必須先按位置傳

站在形參角度上:
    1.位置引數必須傳,有幾個傳幾個
    2.預設引數,可以不傳.如果傳就用傳的.位置在前,預設在後
        def regist(name, age, sex="男")
            print(name, age,sex)
        regist(xx, yy, zz)
    3.動態引數:可以接收任意多個引數
        引數前邊要加*號
        *args不能接收關鍵字引數,元組
        **kwargs可以接收關鍵字引數,字典
        順序:位置引數,*args,預設引數,**kwargs
        預設引數作為形參的時候,放在*args和**kwargs中間
        預設引數作為實參的時候也一樣,並且只能用關鍵子引數形式傳遞
        在形參位置*是聚合,實參位置是打散

4.函式的進階
內建名稱空間--phthon直譯器;
內建的名字在啟動直譯器的時候被載入進記憶體中

全域性名稱空間--寫的程式碼但不是函式中的程式碼
在程式從上倒下執行的過程中一次載入進記憶體的,放置了我們設定的所有變數名和函式名

區域性名稱空間--函式
就是被內部定義的名字,當呼叫函式的時候,才會產生這個名稱空間,隨著函式執行的結束這個名稱空間就消失了

globls()可以檢視全域性作用域中的所有內容
locals()檢視當前作用域中的所有內容

對於不可變資料型別,在區域性可檢視全域性作用於中的變數,不能修改.修改要globls宣告
globals永遠列印全域性;locals輸出宣告根據所在位置
nonlocal引入區域性中離它最近的外層變數,修改只會影響離當前函式最近一層的區域性變數
函式名是第一類物件;函式名就是記憶體地址;函式名可以作為容器型別的元素;函式名可以賦值;函式名可以作為函式的引數

5.函式的巢狀使用

def max(a, b):
    return a if a?b else b
def the max(x, y, z):
    c = max(x, y)
    return max(c, z)
定義;內部函式可以使用外部函式的變數

&&&&&&&內建函式
內建函式68個
反射相關4個
基礎資料型別相關38個
面向物件相關9個
迭代器生成器相關3個
# range(begin, end, 步長)
# next(迭代器)
# iter(可迭代物件)
其他12個
# dir() 檢視內建方法
# callable() 檢查物件是否可被呼叫
# import() 模組相關 匯入模組
import time == import

("time") time.time()
# 某個方法術語某個資料型別的變數,就用.呼叫
# 如果某個方法不依賴任何資料型別,就直接呼叫--內建函式和自定義函式
# hash()
對於可以hash的資料的hash值在一次程式的執行過程中總是不變的
# input()
# print("", end="") 預設不回車
print(1, 2, 3, 4, 5, seq="|") 指定結束符和指定分割符
print("aaa",file=f) 寫到檔案中

    字串型別程式碼的執行
    # eval()                        可以執行字串,不安全
        eval("print(123)")
        eval(“1+2+3+4”)
    # exec()                        同上,但無返回值
        eval適合處理有結果的簡單計算
        exec適合處理簡單流程控制
    # compile() 將字串型別程式碼編譯,程式碼物件能夠通過exec或者eval使用

   數學運算:
      abs(x)        引數可以是整數或浮點數,如果是複數,則返回其大小
                    複數返回絕對值(複數與它的共軛複數的乘積的平方根 a^2+b^2)
      divmod(x, y)    返回個包含商和餘數的元組
   進位制轉換:
      bin()          將int和long int轉換成二進位制 “0bxx” 0b
      hex()          10進位制轉換成16進位制      0x
      oct()          函式將一個整數轉成8進位制數 0o
   資料型別:
      bool()          函式用於將給定引數轉換為布林型別,如果沒有引數,返回False
      comlex()        用於建立一個值為real+imag*j的複數或轉化一個字串或數為複數
                      如果第一個引數為字串,不需要指定第二個引數
                      # complex("1")
                      # +號前後不能有空格
      float()         將整數和字串轉浮點型
      int()           將字串或數字轉整形
   字串程式碼執行:
      !!!compile()    將字串編譯為位元組程式碼 (source, filename, mode('exec', 'eval' or 'single'))
      eval()          執行一個字串表示式,並返回表示式的值
         # eval(expression[, globals[, locals]])
         # eval("3" * "7")
         # 在實際開發中慎用
         # ret = input(">>>")        10,5
           a, b = eval(ret)
           print(a, "+", b)
      exec()
         執行儲存子字串或檔案中的語句,比eval可以執行更復雜的程式碼
   呼叫相關:
      callable()           用於檢查物件是否可被呼叫
         # 注意返回true,object仍然可能呼叫失敗
         # 對於函式、方法、lambda、類以及實現了__call__方法的類例項都返回True
         # callable(object)
   檔案操作:file()          建立file物件,別名open()
         # 有個緩衝概念,後邊瞭解下
   檢視內建屬性:
      dir()          不帶引數返回當前範圍內變數方法和定義的型別列表;帶引數,返回引數的屬性、方法列表
   記憶體相關:
      hash()          獲取物件的雜湊值
      id()            獲取物件的唯一標示符,cpython中得到記憶體地址
   幫助:
      help()          幫助模組
   作用域:
      globals()       函式以字典返回當前位置的全域性變數

      !!ascii()      返回任何物件的可讀版本,將非ascii字元替換為轉義字元

      !!!bytes()     返回位元組物件,或建立指定大小的空位元組物件 bytes(x, encoding,error)
         # bytes 返回位元組物件
         # bytesarray 返回位元組陣列

      !!!bytearray()  返回一個新位元組陣列,這個陣列的元素可變,並且值範圍0<=x<256
         # 注意:如果是可迭代物件,元素不能大於255
                其他資料型別這裡先不做記錄,不清楚這個內函式的用途
                bytearray(x, encoding, error)
                byte()返回一個不能修改的物件 bytearray返回一個可以修改的物件

      all()         用於判斷給定的可迭代引數iterable中所有元素是否都為True
                    如果是返回True,不是返回False
      any()         用於判斷給定的可迭代引數iterable中所有元素是否都為Fales
                    如果是返回False,有一個為True,返回True
         # 注意:在all中,一個空元組或列表返回的是True
                在any中,返回的是的False

      chr()           用0到255之間的整數做參,返回一個對應字元
         # chr(10進位制或16進位制數)
         # 返回的是對應的ascii字元
      !!!classmethod()修飾符對應的函式不需要例項化,不需要self引數,但第一個引數需要是表示自身類的cls引數
                      可以來呼叫類的屬性,類的方法,例項化物件等.

      cmp(x, y)       比較兩個物件,x<y,返回-1;x==y返回0,x>y返回1
         # python3裡目前沒看到

      delattr()       刪除屬性
         # delattr(object, name)
         # object物件,name物件的屬性

      enumerate()     將可遍歷的物件組合為一個索引序列,同時列出下標
         # enumerate(sequence, [start=0])

      filter()        用於過濾序列,返回符合條件元素組成的新列表
                      接收兩個引數,一個是函式,後一個是序列,返回true的放入新表
      format()        關於佔位符另外記錄
      frozenset()     凍結集合,另外記錄
      面向物件:getattr()       返回一個物件的屬性值        關於面向物件?

      hasattr()       判斷物件是否包含對應的屬性
         # hasattr(object, name)
      input()

      !!!isinstance()  判斷一個物件是否是一個已知的型別,類似type()
         # type()不會認為子類是一種父類型別,不考慮繼承
         # isinstance()會認為自雷是一種父類,考慮繼承關係
         # 如果要判斷兩個型別是否相同,推薦使用isinstance()
         # isinstance(object, classinfo)
      !!!issubclass()  判斷引數class是否是型別引數classinfo的子類
         # issubclass(class, classinfo)

      len()
      iter()           用來生成迭代器
         # iter(object[, sentinel])
      list()
      locals()      字典形式返回全部區域性的變數
      map()         做對映
      max()         求最大值
      !!!memoryview()  函式返回給定引數的記憶體檢視物件(memory view)
      min()         求最小值
      next()        返回迭代器下一個專案
      object()      返回一個空物件 不能向這個物件新增新的屬性或方法
                    這個物件是所有類的基礎,它擁有所有類的預設的內建屬性和方法
      open()        建立file()檔案
      ord()         ?
      pow()         返回x的y次方,math模組的方法
      !!!property()    函式的作用是在新式類中返回屬性值
      reduce()      函式對引數序列中元素進行累積
      repr()        函式將物件轉化為供直譯器讀取的形式
      reversed()    反向列表中的元素
      round()       返回浮點數x的四捨五入值
      set()         集合
      setattr()     函式對應函式getattr() 用於設定屬性值,屬性值不一定存在
      slice()       實現切片
      sorted()      sorted可以對所有可迭代物件進行操作 sort只能用於list
                    sorted建立新列表 sort對原表操作
      !!!staticmethod()        返回函式的靜態方法
      str()
      sum()
      super()       用於呼叫父類(超類)的一個方法
      tuple()       元組
      type()
      unichr()      與chr()功能一樣,只不過返回unicode字元
      vars()        返回物件object的屬性和屬性值的字典物件
      zip()






最重要的幾個
    zip()
        # zip(x, y) 拉字典的話,只能拉key
        # 建立字典 dict(zip(x, y))
        # 將可迭代的物件作為引數,將物件中的元素打包成1個個元組,返回這些元組組成的列表
        # 迭代物件元素個數不一樣,按長度短的返回
        # zip在python3中為了減少記憶體,zip返回的是一個物件
        # 如果需要展示需要手動list()轉換

    filter
        去迴圈可迭代的資料,必須是函式的名字;過濾方法
        def is_odd(x):
            return x % 2 == 1
        ret = filter(is_odd, [1, 4, 6, 7, 9, 12, 17])

    map
        ret = map(abs, [1, -4, 6, 8])
        print(ret)              是記憶體地址
        for i in ret:
            print(i)
        #filter        執行了filter之後的結果集合一定是小於等於執行之前的個數
                       filter只管刪選,不會改變原來的值
                       filter是對每個元素過濾,返回迭代器
        #map           執行前後元素個數不變
                       值可能發生改變
                       map是對每個元素做自定義對映,返回迭代器
    sorted
        # sort     是在原列表基礎上排序
        # sorted   返回一個新列表 快 c語言實現的
        # reversed 生成一個新的可迭代型別
        new_l = sorted(l, key=len)

帶key的內建函式 min max filter map sorted 都可以和lambda合作

&&&&&&&匿名函式
# 關鍵字 lambda
列1
def calc(n):
return n**n
print(calc(10))

calc = lambda n: n**n
print(calc(10))

列2
print(max(dic.key = lambda k:dic[k]))

列3
ret = filter(lambda x:x>10, [5, 4, 44])

# 注意事項:
    1.lambda函式不能包含命令
    2.包含的表示式不能超過一個
    3.格式:冒號前是引數,可以有多個,逗號隔開,冒號後邊為表示式
    4.lambda返回值是一個函式的地址,也就是函式物件

  方式1
    a = lambda x: x+3
    print(a)
    print(a(3))

  方式2   注意括號表示呼叫,不表示元組
    (lambda x: x+3)(3)

  方式3   如果有關鍵字引數,需要放在後邊
    (lambda z, x, y: z+x+y)(3, x=4, y=5)

  方式4   可以傳不定長引數
    (lambda *args, x, y: args[0]+x+y)(3, 2, 1, x=4, y=5)