电竞比分网-中国电竞赛事及体育赛事平台

分享

【Python之路】第四篇

 highoo 2019-03-20

三元運算

三元運算(三目運算),是對簡單的條件語句的縮寫

1
2
3
4
5
# 書寫格式
  
result = 1 if 條件 else 2
  
# 如果條件成立,那么將 “值1” 賦值給result變量,否則,將“值2”賦值給result變量

基本數(shù)據(jù)類型補充

set

set集合,是一個無序且不重復的元素集合,它的主要作用如下:

  • 去重,把一個列表變成集合,就自動去重了

  • 關系測試,測試兩組數(shù)據(jù)之前的交集、差集、并集等關系

集合對象是一組無序排列的可哈希的值:集合成員可以做字典的鍵

集合分類:可變集合、不可變集合

可變集合(set):可添加和刪除元素,非可哈希的,不能用作字典的鍵,也不能做其他集合的元素

不可變集合(frozenset):與上面恰恰相反

set

練習:尋找差異

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
old_dict = {
    "#1":11,
    "#2":22,
    "#3":100,
}
new_dict = {
    "#1":33,
    "#4":22,
    "#7":100,
}
old_set = set(old_dict.keys())
new_set = set(new_dict.keys())
same_set = old_set.intersection(new_set)
up_set = new_set.difference(old_set)
ret_dict = {}
for k in same_set:
    ret_dict[k]=new_dict[k]
for i in up_set:
    ret_dict[i]=new_dict[i]
print(ret_dict)
# print(old_set)
# print(new_set)

深淺拷貝

一、數(shù)字和字符串

對于 數(shù)字 和 字符串 而言,賦值、淺拷貝和深拷貝無意義,因為其永遠指向同一個內存地址。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import copy
a = 132
b = 'Ales'
# ## 淺拷貝 ##
aa = copy.copy(a)
bb = copy.copy(b)
# ## 深拷貝 ##
aaa = copy.deepcopy(a)
bbb = copy.deepcopy(b)
print(id(a),id(aa),id(aaa))
print(id(b),id(bb),id(bbb))
# ## 1691783456   1691783456     1691783456
# ##  47227376    47227376       47227376

二、其他基本數(shù)據(jù)類型

對于字典、元祖、列表 而言,進行賦值、淺拷貝和深拷貝時,其內存地址的變化是不同的。

1、賦值

賦值,只是創(chuàng)建一個變量,該變量指向原來內存地址,如:

1
2
3
n1 = {"k1": "wu", "k2": 123, "k3": ["alex", 456]}
   
n2 = n1

2、淺拷貝

淺拷貝,在內存中只額外創(chuàng)建第一層數(shù)據(jù)

1
2
3
4
5
6
7
8
9
10
11
import copy
   
n1 = {"k1": "wu", "k2": 123, "k3": ["alex", 456]}
   
n3 = copy.copy(n1)
print(id(n1),id(n3))
print(id(n1["k1"]),id(n3["k1"]))
# 44947080 45383304
# 45327056 45327056

3、深拷貝

深拷貝,在內存中將所有的數(shù)據(jù)重新創(chuàng)建一份(排除最后一層,即:python內部對字符串和數(shù)字的優(yōu)化)

1
2
3
4
5
6
7
8
9
10
11
12
13
import copy
n1 = {"k1": "wu", "k2": 123, "k3": ["alex", 456]}
n4 = copy.deepcopy(n1)
print(id(n1),id(n4))
print(id(n1["k3"]),id(n4["k3"]))
print(id(n1["k3"][0]),id(n4["k3"][0]))
# 56088200 56460680
# 58962760 58930696
# 56506216 56506216

函數(shù)

一、背景

在學習函數(shù)之前,一直遵循:面向過程編程,

即:根據(jù)業(yè)務邏輯從上到下實現(xiàn)功能,其往往用一長段代碼來實現(xiàn)指定功能,開發(fā)過程中最常見的操作就是粘貼復制,也就是將之前實現(xiàn)的代碼塊復制到現(xiàn)需功能處,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
while True
    if cpu利用率 > 90%:
        #發(fā)送郵件提醒
        連接郵箱服務器
        發(fā)送郵件
        關閉連接
     
    if 硬盤使用空間 > 90%:
        #發(fā)送郵件提醒
        連接郵箱服務器
        發(fā)送郵件
        關閉連接
     
    if 內存占用 > 80%:
        #發(fā)送郵件提醒
        連接郵箱服務器
        發(fā)送郵件
        關閉連接

腚眼一看上述代碼,if條件語句下的內容可以被提取出來公用,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
def 發(fā)送郵件(內容)
    #發(fā)送郵件提醒
    連接郵箱服務器
    發(fā)送郵件
    關閉連接
     
while True
     
    if cpu利用率 > 90%:
        發(fā)送郵件('CPU報警')
     
    if 硬盤使用空間 > 90%:
        發(fā)送郵件('硬盤報警')
     
    if 內存占用 > 80%:

對于上述的兩種實現(xiàn)方式,第二次必然比第一次的重用性和可讀性要好,其實這就是函數(shù)式編程和面向過程編程的區(qū)別:

  • 函數(shù)式:將某功能代碼封裝到函數(shù)中,日后便無需重復編寫,僅調用函數(shù)即可

  • 面向對象:對函數(shù)進行分類和封裝,讓開發(fā)“更快更好更強...”

簡單的例子:求一個長方形的周長和面積。

面向過程的程序設計方式:

1、確定長方形周長和面積的算法。

2、編寫兩個方法(函數(shù))分別計算長方形的周長和面積。

3、求周長的方法(函數(shù))和求面積的方法(函數(shù))需要兩個參數(shù),分別是長方形的長和寬。

面向對象的程序設計方式:

1、一個長方形可以看成一個長方形對象。

2、一個長方形對象有兩個狀態(tài)(長和寬)和兩個行為(求周長和求面積)。

3、將所有長方形的共性抽取出來,設計一個長方形類。

4、通過長方形對象的行為,就可以求出某個具體的長方形對象的周長和面積。

總結:

面向過程是一種以事件為中心的編程思想,以功能(行為)為導向,按模塊化的設計,就是分析出解決問題所需要的步驟,然后用函數(shù)把這些步驟一步一步實現(xiàn),實現(xiàn)的時候一個一個依次調用。

面向對象是一種以事物為中心的編程思想,以數(shù)據(jù)(屬性)為導向,將具有相同一個或者多個屬性的物體抽象為“類”,將他們包裝起來;而有了這些數(shù)據(jù)(屬性)之后,我們再考慮他們的行為(對這些屬性進行怎樣的操作),是把構成問題的事物分解成各個對象,建立對象的目的不是為了完成一個步驟,而是為了描述某個事物在整個解決問題的步驟中的行為。

函數(shù)式編程最重要的是增強代碼的重用性和可讀性

二、定義和使用

1
2
3
4
5
6
def 函數(shù)名(參數(shù)):
        
    ...
    函數(shù)體
    ...
    返回值

函數(shù)的定義主要有如下要點:

  • def:表示函數(shù)的關鍵字
  • 函數(shù)名:函數(shù)的名稱,日后根據(jù)函數(shù)名調用函數(shù)
  • 函數(shù)體:函數(shù)中進行一系列的邏輯計算,如:發(fā)送郵件、計算出 [11,22,38,888,2]中的最大數(shù)等...
  • 參數(shù):為函數(shù)體提供數(shù)據(jù)
  • 返回值:當函數(shù)執(zhí)行完畢后,可以給調用者返回數(shù)據(jù)。

1、返回值

函數(shù)是一個功能塊,該功能到底執(zhí)行成功與否,需要通過返回值來告知調用者。

返回多個對象時,封裝成一個元組返回!

以上要點中,比較重要有參數(shù)和返回值:

1
2
3
4
5
6
7
8
9
10
11
12
13
def 發(fā)送短信():
    發(fā)送短信的代碼...
    if 發(fā)送成功:
        return True
    else:
        return False
    
while True:
    # 每次執(zhí)行發(fā)送短信函數(shù),都會將返回值自動賦值給result
    # 之后,可以根據(jù)result來寫日志,或重發(fā)等操作
    result = 發(fā)送短信()
    if result == False:
        記錄日志,短信發(fā)送失敗...

2、參數(shù)

函數(shù)有三種不同的參數(shù):

  • 普通參數(shù)
  • 默認參數(shù)
  • 動態(tài)參數(shù)
普通參數(shù)
默認參數(shù)
動態(tài)參數(shù)一
動態(tài)參數(shù)二
動態(tài)參數(shù)一,二結合

3.函數(shù)名可以做參數(shù)傳遞

  函數(shù)名()  =>  執(zhí)行函數(shù)

  函數(shù)名    =>  代指函數(shù)內容

1
2
3
4
5
6
7
8
9
10
11
12
13
def f1():
    print("F1")
    return "F1"
def f2(arg):
    arg()
    print("F2")
    return "F2"
f2(f1)
# F1
# F2

內置函數(shù)

注:查看詳細猛擊這里

open()函數(shù) =>  詳情點擊

lambda表達式

學習條件運算時,對于簡單的 if else 語句,可以使用三元運算來表示,即:

1
2
3
4
5
6
7
8
# 普通條件語句
if 1 == 1:
    name = 'eric'
else:
    name = 'alex'
     
# 三元運算
name = 'eric' if 1 == 1 else 'alex'

對于簡單的函數(shù),也存在一種簡便的表示方式,即:lambda表達式

1
func = lambda x,y : x+1
  • 參數(shù)  x,y
  • 函數(shù)體
  • 隱含 return
  • func 函數(shù)名
1
2
3
4
5
6
7
8
9
10
11
12
# ###################### 普通函數(shù) ######################
def f1(x):
    return x+100
result = f1(10)
print(result)
# ###################### lambda ######################
my_lambda = lambda x : x+100
result = my_lambda(10)
print(result)

注意 :

復制代碼
def makelist():
    L = []
    for i in range(5):
        L.append(lambda x: i**x)
    return L

mylist = makelist()

>>> mylist[0](0)
1
>>> mylist[0](1)
4
>>> mylist[0](2)
16
復制代碼

i 為enclosing variables,直到lambda函數(shù)調用時,i 的最終值為4

具體參考python作用域

遞歸

利用函數(shù)編寫如下數(shù)列:

斐波那契數(shù)列指的是這樣一個數(shù)列 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597,2584,4181,6765,10946,17711,28657,46368...

1
2
3
4
5
6
7
8
def f1(a1,a2):
    if a1 == 0:
        print(a1,a2)
    a3 = a1 + a2
    print(a3)
    f1(a2,a3)
f1(0,1)

練習題

1、簡述普通參數(shù)、指定參數(shù)、默認參數(shù)、動態(tài)參數(shù)的區(qū)別

1
2
3
4
# 普通參數(shù):按照形式參數(shù)的指定位置 傳入?yún)?shù)。
# 指定參數(shù):可以在實際參數(shù)里指定任意位置,傳入?yún)?shù)。
# 默認參數(shù):如果實際參數(shù)沒有給形式參數(shù)傳入值  那么默認使用的參數(shù)就是默認參數(shù) 默認參數(shù)需要放到尾部
# 動態(tài)參數(shù):可以無限傳入任意參數(shù),如果是*代表傳入?yún)?shù)的形式將會是元組 **表示將會是字典

2、寫函數(shù),計算傳入字符串中【數(shù)字】、【字母】、【空格] 以及 【其他】的個數(shù)

View Code

3、寫函數(shù),判斷用戶傳入的對象(字符串、列表、元組)長度是否大于5。

View Code

4、寫函數(shù),檢查用戶傳入的對象(字符串、列表、元組)的每一個元素是否含有空內容。

View Code

5、寫函數(shù),檢查傳入列表的長度,如果大于2,那么僅保留前兩個長度的內容,并將新內容返回給調用者。

View Code

6、寫函數(shù),檢查獲取傳入列表或元組對象的所有奇數(shù)位索引對應的元素,并將其作為新列表返回給調用者。

View Code

7、寫函數(shù),檢查傳入字典的每一個value的長度,如果大于2,那么僅保留前兩個長度的內容,并將新內容返回給調用者。

1
2
3
dic = {"k1": "v1v1", "k2": [11,22,33,44]}
  
PS:字典中的value只能是字符串或列表
View Code

8、寫函數(shù),利用遞歸獲取斐波那契數(shù)列中的第 10 個數(shù),并將該值返回給調用者。

View Code

 

    本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內容均由用戶發(fā)布,不代表本站觀點。請注意甄別內容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權內容,請點擊一鍵舉報。
    轉藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多