1. 程式人生 > >python基礎-內置函數-作用域-閉包-遞歸-python3

python基礎-內置函數-作用域-閉包-遞歸-python3

python基礎 內置函數 作用域 閉包

內置函數-作用域-閉包-遞歸

1.幾個可能用到的內置函數

查看內置函數:
    print(dir(__builtins__))
常見函數:
    len 求長度
    min 最小值
    max 最大值
    sorted 排序,從小到大
    reversed 反向
    sum 求和
進制轉換:
    bin()  轉換為二進制
    oct()   轉換為八進制
    hex()   轉換為十六進制
    ord()   將字符轉換成對應的ASIIC碼值
    chr()   將ASIIC碼值轉換成對應的字符
補充:
    1.enumerate()   返回一個可以枚舉的對象
    2.filter()      過濾器
    3.map()         加工。對於參數iterable中的每個元素都應用fuction函數,並返回一個map對象
    4.zip()         將對象逐一配對

1.1 查看參數使用:
    >>> help(sum)
Help on built-in function sum in module builtins:
sum(iterable, start=0, /)
    Return the sum of a ‘start‘ value (default: 0) plus an iterable of numbers
    When the iterable is empty, return the start value.
    This function is intended specifically for use with numeric values and may
    reject non-numeric types.

  >>> sum((1,23,4))
  28
  >>> sum([1,2,3])
  6
  >>> sum([1,2,3],10)
  16
  >>> sum([10,20,30],20)  #值=iterable值+start值
  80
  >>> sum([10,20,30],22)    #值=iterable值+start值
  82
  >>> sum({1:12,2:30})      #key相加 
  3
1.2 二進制:
  >>> bin(1)
  ‘0b1‘
  >>> bin(2)
  ‘0b10‘
1.3 八進制:
  >>> oct(8)
  ‘0o10‘
  >>> oct(12)
  ‘0o14‘
1.4 十六進制:
  >>> hex(10)
  ‘0xa‘
  >>> hex(9)
  ‘0x9‘
  >>> hex(15)
  ‘0xf‘
1.5 將ASIIC碼轉換成相應的字符
  >>> chr(65)
  ‘A‘
  >>> chr(32)
  ‘ ‘
1.6 將字符轉換成ASIIC碼
  >>> ord(‘a‘)
  97
  >>> ord(‘ ‘)
  32
1.7 enumerate:
    >>> help(enumerate)
    Help on class enumerate in module builtins:

    class enumerate(object)
     |  enumerate(iterable[, start]) -> iterator for index, value of iterable
     |  
     |  Return an enumerate object.  iterable must be another object that supports
     |  iteration.  The enumerate object yields pairs containing a count (from
     |  start, which defaults to zero) and a value yielded by the iterable argument.
     |  enumerate is useful for obtaining an indexed list:
     |      (0, seq[0]), (1, seq[1]), (2, seq[2]), ...
     |  
     |  Methods defined here:
     |  
     |  __getattribute__(self, name, /)
     |      Return getattr(self, name).
     |  
     |  __iter__(self, /)
     |      Implement iter(self).
     |  
     |  __new__(*args, **kwargs) from builtins.type
     |      Create and return a new object.  See help(type) for accurate signature.
     |  
     |  __next__(self, /)
     |      Implement next(self).
     |  
     |  __reduce__(...)
     |      Return state information for pickling.
  >>> enumerate([1,2,3,4])
  <enumerate object at 0x000000000343EF78>      #返回一個叠代器
  >>> list(enumerate([1,2,3,4]))                    #查看
  [(0, 1), (1, 2), (2, 3), (3, 4)]              #返回一個帶索引的可枚舉對象,index默認0,也可指定
  >>> list(enumerate([‘a‘,‘b‘,‘c‘,‘d‘]))
  [(0, ‘a‘), (1, ‘b‘), (2, ‘c‘), (3, ‘d‘)]      #返回一個帶索引的可枚舉對象,index默認0,也可指定
  >>> list(enumerate([‘a‘,‘b‘,‘c‘,‘d‘],3))
  [(3, ‘a‘), (4, ‘b‘), (5, ‘c‘), (6, ‘d‘)]
  >>> list(enumerate((1,23,4,5,6),3))
  [(3, 1), (4, 23), (5, 4), (6, 5), (7, 6)]
  >>> list(enumerate({1,2,3,4,5},3))        #返回一個偽索引
  [(3, 1), (4, 2), (5, 3), (6, 4), (7, 5)]
  >>> list(enumerate({1:2,2:3,3:4},3))      #按可以返回
  [(3, 1), (4, 2), (5, 3)]
1.8 filter 過濾器
    >>> help(filter)
    Help on class filter in module builtins:
    class filter(object)
     |  filter(function or None, iterable) --> filter object
     |  Return an iterator yielding those items of iterable for which function(item)
     |  is true. If function is None, return the items that are true.
     |  Methods defined here:
     |  __getattribute__(self, name, /)
     |      Return getattr(self, name).
     |  __iter__(self, /)
     |      Implement iter(self). 
     |  __new__(*args, **kwargs) from builtins.type
     |      Create and return a new object.  See help(type) for accurate signature.
     |  __next__(self, /)
     |      Implement next(self).
     |  __reduce__(...)
     |      Return state information for pickling.
     >>> filter(lambda x:x>2,[1,2,3,4,5])   #lambda x:x>2是個函數體
    <filter object at 0x0000000003420EB8>   #返回函數體
    >>> list(filter(lambda x:x>2,[1,2,3,4,5]))
    [3, 4, 5]
    >>> list(filter(None,[1,2,3,4,5]))
    [1, 2, 3, 4, 5]
1.9 map加工
  >>> help(map)
  Help on class map in module builtins:
  class map(object)
   |  map(func, *iterables) --> map object
   |  Make an iterator that computes the function using arguments from
   |  each of the iterables.  Stops when the shortest iterable is exhausted.
   |  Methods defined here:
   |  __getattribute__(self, name, /)
   |      Return getattr(self, name).
   |  __iter__(self, /)
   |      Implement iter(self).
   |  __new__(*args, **kwargs) from builtins.type
   |      Create and return a new object.  See help(type) for accurate signature. 
   |  __next__(self, /)
   |      Implement next(self).
   |  __reduce__(...)
   |      Return state information for pickling.
   >>> list(map(str,[1,2,3,4]))
    [‘1‘, ‘2‘, ‘3‘, ‘4‘]
1.10 zip 將對象逐一配對
    >>> list(zip([1,2,3],[4,5,6]))
    [(1, 4), (2, 5), (3, 6)]
    >>> list(zip((1,2,3),(4,5,6)))
    [(1, 4), (2, 5), (3, 6)]
    >>> list(zip([1,2,3],(4,5,6)))
    [(1, 4), (2, 5), (3, 6)]
    >>> list(zip([1,2,3,4],[5,6,7,8,9],[‘a‘,‘b‘]))
    [(1, 5, ‘a‘), (2, 6, ‘b‘)]

2.函數內變量的作用域

變量的作用域與其定義的方式有關:
    局部變量:變量在函數內部定義,則變量的作用域在函數內部
    全局變量:變量在函數的外部定義,則變量的作用域是全局

    global:用來在函數或其它局部作用域中,聲明全局變量.(作用於全局)
    nonlocal:用在函數或其它作用域中,聲明外層(非全局)變量。(作用於局部)
使用global情況:
    全局變量可以在函數內部訪問,但 不能改變
    如果在函數內部想修改全局變量,可以使用global來修飾變量

    局部變量只能在局部進行訪問和修改
    如果在函數外部,想訪問局部變量,也可以使用global,將局部變量聲明為全局變量

使用nonlocal的情況:
    當裏層局部,需要修改外層局部時,需要使用nonlocal。(如:嵌套函數)

總結:
    global: 函數中,需要修改全局變量時使用
    nonlocal:當裏層局部,需要修改外層局部時,使用。(局部調用局部,使用nonlocal)

2.1 全局、局部變量
    x=1         #全局變量,全局能被局部引用,但不能被局部修改
    def fun():
        y=2     #局部變量不能進入全局
        print(x,y)
2.2 局部修改全局變量,使用global
    x=1
    def fun():
        global x   #先聲明
        x += 1
        print(x)
2.3 全局調用局部變量,使用global
    def fun():
        global x
        x = 1
        print(x)
2.4 局部變量
    def test():
        a=1             #局部外層變量
        print(a)
        def test2():
            b=2         #局部裏層變量
            print(a,b)
        test2()         #沒有此行,只輸出test()。test2()不輸出
     >>> test()
      1
      1 2
  2.5 局部裏層修改局部外層:
    def test():
      a=1       #局部外層
      print(a)
      def test2():
          b=2       #局部裏層
          nonlocal a        #聲明為局部變量
          a += 1            #修改變量
          print(a,b)
    test2()
    >>> test()
    1
    2 2

3.內嵌函數和閉包

嵌套函數:
  def test():
      a=1
      print(a)
      def test2():
          b=2
          nonlocal a
          a += 1
          print(a,b)
      test2()       #嵌套函數調用內嵌函數
 閉包<兩個函數,嵌套>:
     def test():
        a=1
        print(a)
        def test2():
            b=2
            print(b)
        return test2    #返回裏層函數的函數體-閉包
    >>> test()
    1
    <function test.<locals>.test2 at 0x00000000005B7F28>
回調函數<兩個函數,不嵌套>:
    def test1():
        print(‘first‘)
    def fun(a):
        a()
        print(‘two‘)
    fun(test1)
    ================== RESTART: C:\Users\xinyu\Desktop\test.py ==================
    first
    two

4.遞歸

函數調用自己本身

‘‘‘
例題:有5個人坐在一起,問第五個人多少歲?他說比第4個人大2歲。
       問第4個人歲數,他說比第3個人大2歲。
       問第三個人,又說比第2人大兩歲。
       問第2個人,說比第一個人大兩歲。
       最後問第一個人,他說是10歲。
       請問第五個人多少歲?
‘‘‘
遞歸的核心:
    1.遞歸推導式
    2.遞歸終止條件
def age(n):
    if n == 1:
        return 10
    else:
        return age(n-1)+2

階乘: 5!=5*4*3*2*1
#n != n*(n-1)*(n-2)*....1
def jicheng(n):
    if n == 1:
        return 1
    else:
        return jicheng(n-1)*n

python基礎-內置函數-作用域-閉包-遞歸-python3