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。