python3-2筆記

一.深複製和淺複製
1.引用和賦值
引用是一個值,指向某些數據
列表引用是指向一個列表的值
當你將列表賦給你一個變量時,實際上是將列表的‘引用’賦給了改變變量。
id() : 在內存中一個獨特的空間,相當於索引>>> a=[1,2,3]

>> b=a
>> id(a)
6699720
>> id(b)
6699720
>> b[0]=111
>> id(a)
6699720
>> id(b)
6699720
>> a
[111, 2, 3]
>> b
[111, 2, 3]
>> c=[1,2]
>> d=[1,2]
>> id(c)
7438408
>> id(d)
7438536
>> print(id(a)==id(b))
True

copy模塊的copy()和deepcopy()
copy():複製第一層列表,完全指定在另外的空間,其他層次指定在同一片空間
deepcopy():完全複製過來,任何東西都不會被重複引用到同一個內存空間
淺複製機制:(copy)

>> import copy
>> a
[111, 2, 3]
>> c=copy.copy(a)
>> print(id(a)==id(c))
False
>> c[1]=333
>> c
[111, 333, 3]
>> a
[111, 2, 3]
>> a=[1,2,[3,4]]
>> d=copy.copy(a)
>> d
[1, 2, [3, 4]]
>> print(id(d)==id(a))
False
>> print(id(d[2])==id(a[2]))
True
>> d[2][0]=300
>> a
[1, 2, [300, 4]]
>> d
[1, 2, [300, 4]]
>>

深複製:(deepcopy)

>> e=copy.deepcopy(a)
>> e
[1, 2, [300, 4]]
>> e[2][1]=4444
>> e
[1, 2, [300, 4444]]
>> a
[1, 2, [300, 4]]

二.控制流-條件判斷

#if條件分支
age=eval(input('請輸入你的年齡'))
#eval():自動轉換爲數據類型
if 18<=age<150:
print('你可以談戀愛了!')
elif age>150:
print('妖姬')
else:
print('你沒成年',end=',')
print('不能早戀')

案例一:輸入一個數字,輸出數字對應的星期幾
num=eval(input('請輸入一個數字:'))
if num==1:
print('星期一')
elif num==2:
print('星期二')
elif num==3:
print('星期三')
elif num==4:
print('星期四')
elif num==5:
print('星期五')
elif num==6:
print('星期六')
elif num==7:
print('星期日')
else:
print('輸入數字不合法')

案例二:潤年的判斷(年份能被4整除但不能被100整除或者能被400整除)
num1=eval(input('請輸入一個年份:'))
if (num1%4==0 and num1%100!=0) or num1%400==0:
print('是潤年')
else:
print('不是閏年')

#年齡段的判斷 (注意縮進)
age=eval(input('請輸入你的年齡:'))
if 0< age<18:
pass (通過pass什麼都不顯示)
#print('你是個青少年')
else:
if 18<=age<30:
print('你是個年輕人')
else:
if 30<age<=50:
print('中年人')
else:
if 65<age<120:
print('老年人')
else:
print('你是個異類')

二、循環語句
1.while
i=0 # 如果是i=1呢
while i<100: #那麼i=101
print('<<三國演義>> 我看了%d集'%(i+1))
i=i+1
print ('總有看完了,哭成狗了')

break : 如果遇到beak語句,就會馬上跳出while循環語句
continue :如果程序執行遇到continue,就會馬上跳回到循環開始處,重新循環條件求值。

#死循環
#陷入無限循環中
while True:
print('love you')

for循環和range()函數
利用在條件爲true時,while循環就會繼續循環(這是它的名稱的由來)。
但如果你項讓一個代碼塊執行固定次數,該怎麼辦?
可以通過for循環語句和range()函數來實現。
【for語法】
【for 關鍵詞
一個變量名
in 關鍵字
調用range()方法,最多傳入3個參數
冒號
在下一行開始,縮進的代碼塊(稱爲for子句)】

range()
某些函數可以用多個參數調用,參數之間用的逗號分開,range()
就是其中之一可以改變傳遞給range()的整數,來實現各種整數序列
包括從0以外的值開始range(start,end,step)返回列表
start 起始值,end 終止值,step 步進值 默認爲1

for i in range(1,101):
print ('我跑了%d圈'%i)
print ('我瘦了')

for i in range(100):
print('我跑了%d圈'%(i+1))
print ('我瘦了')

案例一
輸入一個數值,輸出從0到這個數的所有奇數。並且每隔10個數換一行
num=eval(input('請輸入一個數值:'))
for i in range(1,num+1,2):
print(i,end=' ')
#每隔10個數換一行
if (i+1)%20==0:
print()

案例二
已知大公雞5元,母雞3元,小雞1元1個。(百元買百雞)
sum=100
#i、j、k分別表示公雞,母雞、小雞的個數:
for i in range(20):
for j in range(33):
for k in range(0,100,3):
if i+j+k==sum and i5+j3+k/3==sum:
print('公雞買了%d只,母雞買%d只,小雞買了%d只'%(i,j,k))

案例三
已知第一個數爲1,第二個數爲1,並且滿足等式f(x)=f(x-1)+f(x-2),請計算房(100)的值。(斐波那契數列)
list1=[1,1]
for i in range(100)
list1[i].append(list1[i-1]+list1[i-2])

print(第%d項值%d'%(i,list1[i]))

print(list1[99])

圖形輸出
for i in range(1,9):
print(''i)

for i in range(9):
print(''(i+1))

U.異常捕獲
語法:try .... except
異常:
在python程序中遇到錯誤,或異常,意味着整個程序崩潰。我們不希望這發生在真實世界的程序中,相反,你希望程序
能檢測錯誤,處理他們,然後正常運行。
捕獲異常:
一旦產生異常,就捕獲他,然後進行一定處理。
目的就是爲了保證程序的正常執行,不會產生異常而終止程序繼續實行。
list1=[0,1]
try:
print(list2[2])
except NameError as e:
print(e)
except IndexError as e:
print(e)
except BaseException as e:
print(e)
print('程序正常運行')
print('程序正常運行')

函數:
def hello():
print('hello')
print('TOM!!')
print('Hello there')

hello()
hello()
hello()

a.第一行是def語句,它定義了一個名爲hello()函數;
b.def語句之後的代碼塊是函數體,這段代碼在函數調用是執行的
c.函數之後的hello()語句是函數調用。(函數調用就是函數名跟括號)

def hello(name):
print('hello,' +name)

hello('TOM')
hello('xp')
a.在這個程序的hello()函數定義中,有一個名爲name的變元;
b.變員是一個變量,當函數調用時,參數就存放在其中。
c.保存在變元中的值,在函數返回就丟失了。

返回值和return語句
如果調用len()函數,並向他傳入像‘hello’這樣的參數調用就求值爲整數5,這是傳入的字符串長度
一般來說,函數調用求值的結果,成爲函數的返回值。

a.return語句包含以下部分
.return 關鍵字
.函數應該返回的值或表達式
b.如果在return語句中使用了表達式,返回值就是該表達式求值的結果。
c.如果使用不帶值得return語句(也就是中有return本身),那麼久返回None.
1
def hello(name):
return '再見'
print(hello('周老師'))
2.
def hello(name):
return 或者pass
print(hello('周老師'))

搖獎小程序:
定義一個函數,它根據傳入的數學參數,返回一個同的字符串

步驟:
1.導入隨機數模塊(import random)
2.構建一個函數體
3.產生隨機數
4.調用函數
#導入隨機數模塊
import random
#產生一個1-9隨機真正整數
a=random.randint(1,9)
#print(a)
def Answer(num):
if num==1:
return '一等獎'
elif num==2:
return '二等獎'
elif num==3:
return'三等獎'
elif num==4:
return '參與獎'
else:
return '謝謝參與'
print(Answer(a))

lambda表達式定義(也稱爲匿名函數)
a.lambda只是一個表達式,函數體比def簡單
b.lamdba主體爲一個表達式,不是代碼塊,僅僅能在lambda表達式中封裝有限的邏輯進去。
(1)無參數形式
a=lambda:'ixp'
print (a())
(2)有參數形式:
a=lambda x:x**2
print (a(10))
(3)取出x的每一項,2倍數都部遍歷出來
b=lamdba x:[i for i in x if i%2==0] #生成器
print b([1,2,3,4,5,6,])

#生成器
c=lambda x:[i for i in x if i%2==0]
#取出X的每一項,2的倍數全部遍歷出來
print(c([1,2,3,4,5,6]))

Filter(),map(),reduce()
python內置了一些特殊函數,這些函數很具有python特性。
可以讓代碼更加簡潔。filter,map,reduce三個函數比較類似,都是應用於序列的內置函數,常見的序列包括list、tuple、str.
通常與lambda表達式連用。

1.filter 函數
filter 函數會對指定序列執行過濾操作,批量提取。
filter 函數的定義:
filter (function or None,seq) -->list,tuple,or string
filter 函數會對序列參數sequence中的每個元素調用function函數,最後返回的結果包含調用結果爲true的元素。

案例一:
取出列表裏的能被3整除的元素
foo=[2,18,9,22,17,24,8,12,27]
print filter(lambda:xx%3==0,foo )

2.map函數
map函數會根據提供的函數對指定序列做批量處理。
map函數的定義
map(function,seq,[seq,...]) >list
通過定義可以看到,這個函數的第一個參數是一個函數,剩下的參數是一個或多個序列。
function可以理解爲是一個一對一或多對一的函數,map的作用是以參數序列中的每個元素調用function函數,返回包含每次function函數
返回值得list.

案例二:
1.對一個序列中的每個元素進行平方運算:
map(lambda x:x**2,[1,2,3,4,5])

#map
b=map(lambda x:x**2,[1,2,3,4,5])
print (list(b))

2.對兩個序列中的元素依次求和。
map(lambda x,y:x+y,[1,3,5,7,9],[2,4,6,8,10])
注意:在參數存在多個序列時,會依次以每個序列中相同位置的元素做參數調用function函數。

c=map(lambda x,y:x+y,[1,3,5,7,9],[2,4,6,8,10])
print(list(c))

3.當函數爲None時。
map(None,[1,3,5,7,9],[2,4,6,8,10])
c=map(None,[1,3,5,7,9],[2,4,6,8,10])
print(c) (只能這樣類型輸出)

reduce函數
reduce函數會對參數序列中元素進行總體計算。
reduce函數的定義;
reduce(fuction,seq,initial)->value
function參數是一個有兩個參數的參數,reduce依次從seq中取一個元素,和上次調用function
的結果做參數再次調用function.
第一次調用function時,如果提供inital參數,會以seq中的第一個元素和
inital作爲參數調用function,否則會以序列seq中的前兩個元素作參數調用function.
#reduce批量計算
#python3要引入模塊functools
案例三:
1.reduce(lambda x,y:x+y,[2,3,4,5,6],1)
結果爲21(((((1+2)+3)+4)+5)+6))
import functools
d=functools.reduce(lambda x,y:x+y,[2,3,4,5,6],1)
print(d)
#Y=1,x=2 x=x+y
#x=3,y=3
#x6,y=4
#x10,y=5
#x=15 ,y=6
#x=21
2.reduce(lambda x,y:x+y,[2,3,4,5,6])
結果爲21(((((1+2)+3)+4)+5)+6))

import functools
d=functools.reduce(lambda x,y:x+y,[2,3,4,5,6])
print(d)
#Y=2,x=3
#x=5,y=4
#x9,y=5
#x14,y=6
#x=21
#否則會以序列seq中的前兩個元素作參數調用function.
function不能爲None

小結:
Filter 函數
語法:Filter(funtion or None.seq)
應用:對數據進行批量提取

map函數
語法:map(funtion,seq,[seq,...])
應用:對數據進行批量提取

Reduce函數
語法:reduce(funtion,sequence,[initial])
應用:對數據進行總體計算

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章