順序執(zhí)行
https://www.liujiangblog.com/course/python/26
# 代碼執(zhí)行過程基本原則:
# 普通語句粪躬,直接執(zhí)行翔脱;
# 碰到函數(shù),將函數(shù)體載入內(nèi)存擦酌,并不直接執(zhí)行
# 碰到類宵晚,執(zhí)行類內(nèi)部的普通語句恨旱,但是類的方法只載入,不執(zhí)行
# 碰到if坝疼、for等控制語句搜贤,按相應(yīng)控制流程執(zhí)行
# 碰到@,break钝凶,continue等仪芒,按規(guī)定語法執(zhí)行
# 碰到函數(shù)唁影、方法調(diào)用等,轉(zhuǎn)而執(zhí)行函數(shù)內(nèi)部代碼掂名,執(zhí)行完畢繼續(xù)執(zhí)行原有順序代碼
import os # 1
print('<[1]> time module start') # 2
class ClassOne():
print('<[2]> ClassOne body') # 3
def __init__(self): # 10
print('<[3]> ClassOne.__init__')
def __del__(self):
print('<[4]> ClassOne.__del__') # 101
def method_x(self): # 12
print('<[5]> ClassOne.method_x')
class ClassTwo(object):
print('<[6]> ClassTwo body') # 4
class ClassThree():
print('<[7]> ClassThree body') # 5
def method_y(self): # 16
print('<[8]> ClassThree.method_y')
class ClassFour(ClassThree):
print('<[9]> ClassFour body') # 6
def func():
print("<func> function func")
if __name__ == '__main__': # 7
print('<[11]> ClassOne tests', 30 * '.') # 8
one = ClassOne() # 9
one.method_x() # 11
print('<[12]> ClassThree tests', 30 * '.') # 13
three = ClassThree() # 14
three.method_y() # 15
print('<[13]> ClassFour tests', 30 * '.') # 17
four = ClassFour()
four.method_y()
print('<[14]> evaltime module end') # 100
-----------------------------------------------------------
<[1]> time module start
<[2]> ClassOne body
<[6]> ClassTwo body
<[7]> ClassThree body
<[9]> ClassFour body
<[11]> ClassOne tests ..............................
<[3]> ClassOne.__init__
<[5]> ClassOne.method_x
<[12]> ClassThree tests ..............................
<[8]> ClassThree.method_y
<[13]> ClassFour tests ..............................
<[8]> ClassThree.method_y
<[14]> evaltime module end
<[4]> ClassOne.__del__
__name__ 和__main__關(guān)系
https://www.cnblogs.com/chenhuabin/p/10118199.html
if __name__ == '__main__':
__name__是所有模塊都會有的一個內(nèi)置屬性
當(dāng)哪個模塊(腳本)被直接執(zhí)行時据沈,該模塊“__name__”的值就是“__main__”,
當(dāng)被導(dǎo)入另一模塊(腳本)時饺蔑,“__name__”的值就是模塊的真實(shí)名稱锌介。
所以當(dāng)運(yùn)行腳本時,自己腳本下if __name__ == '__main__':為True猾警,后面的語句繼續(xù)執(zhí)行孔祸,
如果被其他腳本import或調(diào)用時,為Flase发皿,后面語句不執(zhí)行崔慧。
break只能退出一層循環(huán),對于多層嵌套循環(huán)穴墅,不能全部退出惶室。
continue不會退出和終止循環(huán),只是提前結(jié)束當(dāng)前輪次的循環(huán)
默認(rèn)參數(shù)
# 默認(rèn)參數(shù)必須在位置參數(shù)后面
# 有多個默認(rèn)參數(shù)的時候玄货,通常將更常用的放在前面皇钞,變化較少的放后面。
# 盡量給實(shí)際參數(shù)提供默認(rèn)參數(shù)名松捉。
def power(x, n = 2):
return x**n
ret1 = power(10) # 使用默認(rèn)的參數(shù)值n=2
ret2 = power(10, 4) # 將4傳給n夹界,實(shí)際計算10**4的值
動態(tài)參數(shù)
# 必須放在所有的位置參數(shù)和默認(rèn)參數(shù)后面!
# *args:一個星號表示接收任意個參數(shù)惩坑。
# **kwargs:兩個星表示接受鍵值對的動態(tài)參數(shù)
def func(a, b, c=1, *args, **kwargs):
print('c的值是:', c)
for arg in args:
print(arg)
for kwg in kwargs:
print(kwg, kwargs[kwg])
lis = ['aaa', 'bbb', 'ccc']
dic = {
'k1': 'v1',
'k2': 'v2'
}
func(1, 2, *lis, **dic)
-----------------------------------------------
c的值是: aaa
bbb
ccc
k1 v1
k2 v2
全局變量 global
total = 0 # total是一個全局變量
print("函數(shù)外的total的內(nèi)存地址是: ", id(total))
def plus( arg1, arg2 ):
global total # 使用global關(guān)鍵字申明此處的total引用外部的total
total = arg1 + arg2
print("函數(shù)內(nèi)局部變量total= ", total)
print("函數(shù)內(nèi)的total的內(nèi)存地址是: ", id(total))
return total
plus(100, 200)
print("函數(shù)外部全局變量total= ", total)
print("函數(shù)外的total的內(nèi)存地址是: ", id(total))
---------------------------
函數(shù)外的total的內(nèi)存地址是: 140712987878000
函數(shù)內(nèi)局部變量total= 300
函數(shù)內(nèi)的total的內(nèi)存地址是: 2464464009200
函數(shù)外部全局變量total= 300
函數(shù)外的total的內(nèi)存地址是: 2464464009200
# global
a = 1
print("1函數(shù)outer調(diào)用之前全局變量a的內(nèi)存地址: ", id(a))
def outer():
a = 2
print("2函數(shù)outer調(diào)用之時閉包外部的變量a的內(nèi)存地址: ", id(a))
def inner():
global a # 注意這行
a = 3
print("3函數(shù)inner調(diào)用之后閉包內(nèi)部變量a的內(nèi)存地址: ", id(a))
inner()
print("4函數(shù)inner調(diào)用之后掉盅,閉包外部的變量a的內(nèi)存地址: ", id(a))
outer()
print("5函數(shù)outer執(zhí)行完畢也拜,全局變量a的內(nèi)存地址: ", id(a))
--------------------------------------
1函數(shù)outer調(diào)用之前全局變量a的內(nèi)存地址: 140712987878032
2函數(shù)outer調(diào)用之時閉包外部的變量a的內(nèi)存地址: 140712987878064
3函數(shù)inner調(diào)用之后閉包內(nèi)部變量a的內(nèi)存地址: 140712987878096
4函數(shù)inner調(diào)用之后以舒,閉包外部的變量a的內(nèi)存地址: 140712987878064
5函數(shù)outer執(zhí)行完畢,全局變量a的內(nèi)存地址: 140712987878096
# nonlocal
a = 1
print("1函數(shù)outer調(diào)用之前全局變量a的內(nèi)存地址: ", id(a))
def outer():
a = 2
print("2函數(shù)outer調(diào)用之時閉包外部的變量a的內(nèi)存地址: ", id(a))
def inner():
nonlocal a # 注意這行
a = 3
print("3函數(shù)inner調(diào)用之后閉包內(nèi)部變量a的內(nèi)存地址: ", id(a))
inner()
print("4函數(shù)inner調(diào)用之后慢哈,閉包外部的變量a的內(nèi)存地址: ", id(a))
outer()
print("5函數(shù)outer執(zhí)行完畢蔓钟,全局變量a的內(nèi)存地址: ", id(a))
---------------------------
1函數(shù)outer調(diào)用之前全局變量a的內(nèi)存地址: 140712987878032
2函數(shù)outer調(diào)用之時閉包外部的變量a的內(nèi)存地址: 140712987878064
3函數(shù)inner調(diào)用之后閉包內(nèi)部變量a的內(nèi)存地址: 140712987878096
4函數(shù)inner調(diào)用之后,閉包外部的變量a的內(nèi)存地址: 140712987878096
5函數(shù)outer執(zhí)行完畢卵贱,全局變量a的內(nèi)存地址: 140712987878032
# Python函數(shù)的作用域取決于其函數(shù)代碼塊在整體代碼中的位置滥沫,而不是調(diào)用時機(jī)的位置
name ='jack'
def f1():
print(name)
def f2():
name = 'eric'
f1()
f2()
----------------------------------------
jack
range()
# 默認(rèn)從0開始,到參數(shù)減1,左閉右開
a = ['Google', 'Baidu', 'Huawei', 'Taobao', 'QQ']
for i in range(len(a)):
print(i, a[i])
--------------------------------------
1 Baidu
2 Huawei
3 Taobao
4 QQ
# 切片
for i in range(10,1,-2):
print(i)
------------------------------------
10
8
6
4
2
lambda匿名函數(shù)
# lambda 參數(shù): 表達(dá)式键俱。
# 匿名函數(shù)作為別的函數(shù)的返回值返回
def add(string, i):
return lambda: int(string) + i
>>> f = lambda x: x * x
>>> f
<function <lambda> at 0x3216fef44>
>>> f(6)
36
推導(dǎo)式
# 1. 列表推導(dǎo)式
>>> [x * x for x in range(1, 11) if x % 2 == 0]
[4, 16, 36, 64, 100]
>>> [a + b for a in ‘123' for b in ‘a(chǎn)bc']
['1a', '1b', '1c', '2a', '2b', '2c', '3a', '3b', '3c']
# 2. 字典推導(dǎo)式
>>> dic = {x: x**2 for x in (2, 4, 6)}
>>> dic
{2: 4, 4: 16, 6: 36}
>>> type(dic)
<class 'dict'>
# 3. 集合推導(dǎo)式
>>> a = {x for x in 'abracadabra' if x not in 'abc'}
>>> a
{'d', 'r'}
>>> type(a)
<class 'set'>
# 4. 元組推導(dǎo)式
tup = tuple(x for x in range(9))
print(tup)
print(type(tup))
------------------------
結(jié)果:
(0, 1, 2, 3, 4, 5, 6, 7, 8)
<class 'tuple'>
迭代器
# Python中兰绣,list/tuple/string/dict/set/bytes都是可以迭代的數(shù)據(jù)類型。
# 可以通過collections模塊的Iterable類型來判斷一個對象是否可迭代:
>>> from collections import Iterable
>>> isinstance('abc', Iterable) # str是否可迭代
True
>>> isinstance([1,2,3], Iterable) # list是否可迭代
True
>>> isinstance(123, Iterable) # 整數(shù)是否可迭代
False
# 通常要實(shí)現(xiàn)兩個基本的方法:iter() 和 next()编振。
>>> lis=[1,2,3,4]
>>> it = iter(lis)
>>> type(it)
<class 'list_iterator'>
>>> next(it)
1
>>> next(it)
2
>>> next(it)
3
>>> next(it)
4
>>> next(it)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
# for循環(huán)遍歷迭代器:
lis = [1,2,3,4]
it = iter(lis) # 創(chuàng)建迭代器對象
for x in it: # 使用for循環(huán)遍歷迭代對象
print (x, end=" ")
generator生成器
# 數(shù)量巨大缀辩,放入內(nèi)存,壓力大。不必創(chuàng)建完整的元素集合臀玄,推算出來到哪就計算到哪個瓢阴。
# 斐波那契函數(shù)
def fibonacci(n):
a, b, counter = 0, 1, 0
while True:
if counter > n:
return
yield a # yield返回的函數(shù)變成一個生成器
a, b = b, a + b
counter += 1
fib = fibonacci(10) # fib是一個生成器
print(type(fib))
for i in fib:
print(i, end=" ")