python3筆記 7 包、模塊、函數與變量作用域

7-1 while循環與使用場景

while循環和for循環
counter = 1

while counter <= 10:
    counter += 1
    print(counter)
else:
    print('Eof')    #while結束後會執行else
ctrl + c 結束死循環
遞歸適合用while

7-2 for與for-else循環 

for主要是用來遍歷/循環 序列或者集合、字典
對應於其他語言中的for each
a = [['apple','orange','banana','grape'],(1,2,3)]
for x in a:
    for y in x:
        print(y,end = ' ')    #一橫行打印
else:
    print('fruit is gone')

利用break和continue跳過某些字符:
a = [1,2,3]
for x in a:
    if x == 2:
        continue
    print(x)

利用break打斷的for循環不會執行else裏的語句,而continue會執行else
a = [1,2,3]
for x in a:
    if x == 2:
        break
    print(x)
else:
    print('EOF')    #此句不執行

循環二維數組時跳出
a = [['apple','orange','banana','grape'],(1,2,3)]
for x in a:
    for y in x:
        if y == 'orange':
            break    #只跳出了內層循環
        print(y,end = ' ')
else:
    print('fruit is gone')

7-3 for 與 range 

利用range()打印0-9
for x in range(0,10):
    print(x)

rang(首,跨度,步長)打印0,2,4,6,8
for x in range(0,10,2):
    print(x,end = ' | ')
#0 | 2 | 4 | 6 | 8 |

遞減的等差數列:
for x in range(10,0,-2):
    print(x,end = ' | ')
# 10 | 8 | 6 | 4 | 2 |

7-4 新篇章導言 

高性能、封裝性、可複用的代碼考驗邏輯能力和抽象能力

7-5 Python工程的組織結構:包、模塊兒、類 

最頂級的組織結構:包(文件夾)
第二個層級:模塊(文件)
第三個層級:類
第四個層級:函數、變量(不屬於組織結構,是類本身的特性)

7-6 Python包與模塊的名字 

區分不同包的同名模塊:包名.模塊名
形成的模塊的路徑叫做命名空間

一個包下面可以有子包,模塊可以和包平級

普通文件夾想要變成包必須要有__init__.py文件
__init__.py本身也是一個模塊,可以不寫內容只是標註包
特殊地,__init__.py模塊的名字就是包名

7-7 import導入模塊 

對於重複的定義需要從其他模塊裏引用。
利用 import 模塊名 導入
#test1.c1
a = 1

#test1.c2
import c1
print(c1.a)

#1
import導入的總是模塊,需要用模塊名.變量名的方法引用
可以用 as簡化書寫
#test1.c1
a = 1

#test1.c2 
import c1 as m
print(m.a)

#1
優點是可以一眼看出屬於哪個模塊

7-8 from import 導入變量 

#test1.c2
from c1 import a
print(a)

也可以from 包 import 模塊
引用時用 模塊.變量

引用大量變量時使用 * :
#test1.c1
a = 1
b = 2
c = 3
d = 4

#test1.c2 
from c1 import *
print(a)
print(b)
print(c)
print(d)

控制*的行爲:
#test1.c1
__all__ = ['a','c']    #用內置變量__all__來控制*的選擇範圍
a = 1
b = 2
c = 3
d = 4

#test1.c2 
from c1 import *
print(a)
print(c)
print(d)    #d沒有被打印,報錯

7-9 __init__.py 的用法

隱藏__pycache__文件夾


代碼換行:在上一行末尾加上\或者加上括號利用括號的特性換行

當包被導入時,__init__.py會首先自動被執行
#test1.__init__.py
a = 'This is a __init__.py file'
print(a)

#c8.py
import test1

#This is a __init__.py file

__init__.py的應用場景:
#test1. __init__.py
__all__ = ['c1','c2']    #初始化*

#test1. __init__.py
import sys        #批量導入庫
import datetime
import io

#c8.py
import test1
print(test1.sys.path)

7-10 包與模塊的幾個常見錯誤

包和模塊是不會被重複導入的,只會執行一次(入口文件的概念)
避免循環導入,不要形成閉環
導入模塊的時候會執行模塊裏所有的代碼

7-11 模塊內置變量

#test1.c3
infos = dir()    //打印當前模塊內所有變量
print(infos)
# ['__annotations__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__']

#test1.c4.py
'''
    This is a c4 doc
'''
print('name:' + __name__)
print('package:' + __package__)
#print('doc:' + __doc__)    #doc指的是模塊的註釋
print('file:' + __file__)

#c9.py
import test1.c4

#name:test1.c4
#package:test1
#doc:
#   This is a c4 doc
#file:c:\Users\Tai Park\Documents\python\test1\c4.py

7-12 入口文件和普通模塊內置變量的區別

#c9.py
'''
This is a c9 doc
'''
import test1.c4
print('_________________')
print('name:' + __name__)
print('package:' + (__package__ or '當前模塊不屬於任何包'))
print('doc:' + __doc__)
print('file:' + __file__)

name:test1.c4
package:test1
doc:
    This is a c4 doc

#name:test1.c4
#package:test1
#doc:
#    This is a c4 doc
#file:c:\Users\Tai Park\Documents\python\test1\c4.py
#_________________
#name:__main__        #入口文件中__name__會被強制修改爲__main__ 
#package:當前模塊不屬於任何包
#doc:
#   This is a c9 doc
#
#file:c9.py        #入口文件中路徑不同 ,和執行python命令所在目錄是有關係的

7-13 __name__的經典應用 

dir()可以打印當前所有變量,若不傳參數顯示所有,傳參顯示特定的變量
import sys

infos = dir(sys)
print(infos)

make a script both importable and executable:
if __name__ == '__main__':
    print('This is app')
else:
    print('This is a module')

cmd中 python -m 命名空間.模塊 可以將其當作模塊來運行
作爲普通模塊必須要有包,可執行文件沒有包

7-14 相對導入和絕對導入 一 

有一個主入口文件。
可執行文件和頂級包在同一級。
絕對導入:從頂級包開始往下導入
相對導入:. 當前目錄 ..上級目錄 ...上上級目錄

7-15 相對導入和絕對導入 二 

相對導入不能超過頂級包。
入口不能用相對路徑導入,相對路徑根據__name__定位,而入口文件被強制改成了__main__所以不能使用。
若想在入口文件使用相對導入,用-m。

我的個人博客: 點擊打開鏈接