PYTHON部分基礎(chǔ)D3

順序執(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=" ")
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市健无,隨后出現(xiàn)的幾起案子荣恐,更是在濱河造成了極大的恐慌,老刑警劉巖累贤,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件叠穆,死亡現(xiàn)場離奇詭異,居然都是意外死亡畦浓,警方通過查閱死者的電腦和手機(jī)痹束,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來讶请,“玉大人祷嘶,你說我怎么就攤上這事《嵋纾” “怎么了论巍?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長风响。 經(jīng)常有香客問我嘉汰,道長,這世上最難降的妖魔是什么状勤? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任鞋怀,我火速辦了婚禮,結(jié)果婚禮上持搜,老公的妹妹穿的比我還像新娘密似。我一直安慰自己,他們只是感情好葫盼,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布残腌。 她就那樣靜靜地躺著,像睡著了一般贫导。 火紅的嫁衣襯著肌膚如雪抛猫。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天孩灯,我揣著相機(jī)與錄音闺金,去河邊找鬼。 笑死峰档,一個胖子當(dāng)著我的面吹牛败匹,可吹牛的內(nèi)容都是我干的匣距。 我是一名探鬼主播,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼哎壳,長吁一口氣:“原來是場噩夢啊……” “哼毅待!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起归榕,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤尸红,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后刹泄,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體外里,經(jīng)...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年特石,在試婚紗的時候發(fā)現(xiàn)自己被綠了盅蝗。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡姆蘸,死狀恐怖墩莫,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情逞敷,我是刑警寧澤狂秦,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布,位于F島的核電站推捐,受9級特大地震影響裂问,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜牛柒,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一堪簿、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧皮壁,春花似錦椭更、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽协饲。三九已至畏腕,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間茉稠,已是汗流浹背描馅。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留而线,地道東北人铭污。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓恋日,卻偏偏與公主長得像,于是被迫代替她去往敵國和親嘹狞。 傳聞我的和親對象是個殘疾皇子岂膳,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評論 2 345

推薦閱讀更多精彩內(nèi)容