天天看點

Python子產品與函數

Table of Contents

Table of Contents

​​1. Python程式的結構​​

​​2. 子產品​​

​​2.1 子產品的建立​​

​​2.2 子產品的屬性​​

​​2.3 子產品的内置函數​​

​​1. appy()​​

​​2. filter()​​

​​3. reduce()​​

​​ 4.map()​​

​​5 自定義包​​

​​3. 函數​​

​​3.1 格式​​

​​3.2 仿switch源碼​​

​​3.3 lambda函數​​

​​3.4 generator函數​​

1. Python程式的結構

Python程式由包、子產品、類、函數組成,子產品是處理一類問題的集合,子產品由函數和類組成,包是由一系列子產品構成;

2. 子產品

2.1 子產品的建立

建立一個子產品檔案:myPython.py

count = 0
def func():
    #引用全局變量
    global count
    count = count + 1
    print("myModule.func() count=%d" % count)
class MyClass:
    def MyFunc(self):
        print("myModule.MyClass.myFunc()");      

在同一個目錄下建立一個檔案:helloworld.py

#導入子產品
import myModule

#使用子產品中的func函數
myModule.func()
#使用子產品中的類
myClass = myModule.MyClass()
myClass.MyFunc()

print("-----------------------")

#導入子產品中的函數或類
from myModule import func
#直接使用子產品的函數
func()      

運作結果:

C:\Python\Python38\python.exe "E:/python/python project/hello world.py"
myModule.func() count=1
myModule.MyClass.myFunc()
-----------------------
myModule.func() count=2      
總結:
關于導入子產品的幾種方式
1. import xxxx_module
2. from xxxx_module import xxxx_func
3. from xxxx_module import *      

2.2 子產品的屬性

__name__:用于判斷目前子產品是否是程式的入口,如果目前程式正在被使用,__name__的值為“__main__”;

__doc__:用于顯示目前子產品的資訊,其為子產品字元串,子產品字元串寫在Python檔案的第一行,三個引号包含起來的字元串;

myModule.py

""""This is my myModule.py"""

if __name__ == '__main__':
    print("myModule作為主程式")
else:
    print("myModule被另外一個子產品調用")

print(__doc__)      

helloworld.py

""" This is my helloWorld.py"""
#導入子產品
import myModule

print(__doc__)      

輸出結果:

C:\Python\Python38\python.exe "E:/python/python project/hello world.py"
myModule被另外一個子產品調用
"This is my myModule.py
 This is my helloWorld.py      

2.3 子產品的内置函數

1. appy()

Python3中移除了該函數;

2. filter()

filter()可以對某個序列做過濾處理,判斷自定義函數的參數傳回的結果是否為真來過濾,并一次性傳回處理結果;

格式:

filter(function or Nome, iterable)->filter object      

源碼:

def func(x):
    if x > 0:
        return x;

#filter内置函數傳回對象
print(filter(func, range(-1, 10, 1)))

#filter對象轉換為函數
print(list(filter(func, range(-1, 10, 1))))      

輸出結果:

C:\Python\Python38\python.exe "E:/python/python project/hello world.py"
<filter object at 0x000000000209D5B0>
[1, 2, 3, 4, 5, 6, 7, 8, 9]      

3. reduce()

對序列中元素的連續操作可以通過循環來處理,例如對某個序列中的元素累加操作

源碼:

​輸出結果:​

C:\Python\Python38\python.exe "E:/python/python project/hello world.py"
x=0, y=1
x=1, y=2
x=3, y=3
x=6, y=4
10
------------------------------------
x=10, y=0
x=10, y=1
x=11, y=2
x=13, y=3
x=16, y=4
20
------------------------------------
10
------------------------------------      

 4.map()

map()對tuple元組進行“解包”操作,調用時設定map()的第一個參數為None,map()的功能非常強大,可以對多個序列的每個元素都執行相同的操作,并傳回一個map對象;

源碼:

def power(x):
    print("x=%d" % x)
    return x ** x

print(map(power, range(1, 3)))
print(list(map(power, range(1, 5))))      

輸出結果:

C:\Python\Python38\python.exe "E:/python/python project/hello world.py"
<map object at 0x00000000021DD5B0>
x=1
x=2
x=3
x=4
[1, 4, 27, 256]      

5 自定義包

與2.2中提到的__name__描述一樣,這裡不再贅述。

3. 函數

3.1 格式

def func(param1, param2,...):
    ....
    return xxx;      

3.2 仿switch源碼

def math(x, y, operator):
    results = {
        "+" : x + y,
        "-" : x - y,
        "*" : x * y,
        "/" : x / y,
        "%" : x % y,
    }
    return results.get(operator)

print(math(1, 3, "+"))
print(math(1, 3, "-"))
print(math(1, 3, "*"))
print(math(1, 3, "/"))
print(math(1, 3, "%"))      

結果:

C:\Python\Python38\python.exe "E:/python/python project/hello world.py"
4
-2
3
0.3333333333333333
1      

3.3 lambda函數

格式:

func = lambda 變量1,變量2... : 表達式      

代碼:

def func():
    x = 1
    y = 2
    z = 3
    sum = lambda x,y,z : x + y + z
    print(sum)
    print(sum(x, y, z))

func()      

結果:

C:\Python\Python38\python.exe "E:/python/python project/hello world.py"
<function func.<locals>.<lambda> at 0x000000000229D160>
6      

3.4 generator函數

格式:

def func(x)
    ...
    yield 表達式      

yield關鍵字與return關鍵字的傳回值和執行原理都不相同。yield生成值并不會中止程式的執行,傳回值後程式繼續往後執行。return傳回值後,程式将中止執行。