一、記憶體管理
變量在動态語言中,無須事先聲明,也不需要制定類型;
程式設計中一般無須關心變量的存亡,也不需要關心記憶體的管理;
Python使用“引用計數”記錄所有對象的引用數
當對象引用數變為0,它就可以被“垃圾回收”GC
計算增加:指派給其他變量就增加引用計數,例如X=3,Y=X
計數減少:函數運算結束時,局部變量就會被自動銷毀,對象引用計數減少;
變量被指派給其他對象。例如:x=3;y=x;x=4
當“引用計數”歸0,即表示該對象不再被使用,垃圾回收機制會定期對“引用計數”标記為0的對象進行釋放。
有關性能的時候,就需要考慮變量的引用問題,但是該釋放記憶體,還是盡量不釋放記憶體,看需求。
##相關問題###
記憶體空洞是如何産出的;
如何規避記憶體空洞;
記憶體回收優化方案;
二、程式控制
順序執行
按照先後順序一條條執行;
分支結構
根據不同的情況判斷,條件滿足執行某條件下的語句;
循環執行
條件滿足就反複執行,不滿足就不執行或不再執行;
if語句
if condition:
代碼塊
condition必須是一個bool類型,這個地方有一個隐式轉換bool 參考“真值表”
真值表
對象/常量
值
總結
""
假
False等價布爾值,相當于bool(value)
空集合
空字元串
空字典
空清單
空元組
None對象
"string"
真
假
>=1
真
<=-1
真
()空元組
假
[]空清單
假
{}空字典
假
None
假
多分支結構
if…elif…else語句
if condition1:
代碼塊1
elif condition2:
代碼塊2
elif condition3:
代碼塊3
……
else:
代碼塊
分支嵌套舉例:
嵌套結構,可以是分支、循環的嵌套;
可以互相嵌套多層。
score=80
if score<0:print('wrong')else:if score==0:print('egg')elif score <= 100:print('right')else:print('too big')
使用input函數
input函數擷取鍵盤輸入input([prompt])
檢視幫助文檔方法一:
檢視幫助方法二:
注:Python中,下劃線“_”是一個合法的辨別符
同時也是一個特殊辨別符,它指的是上一次output的結果
練習:
1.輸入2個數字,輸出最大數
a = int(input('input a number:'))
b= int(input('input a number:'))if a >b:print(a)else:print(b)
代碼等效(使用三元表達式:真值 if 條件 else 假值):
a = int(input('input a number:'))
b= int(input('input a number:'))print(a) if a > b else print(b)
2.給定一個不超過5位的正整數,判斷其有幾位
#使用if…elif…else…
a = int(input('input a number:') )if a<10:print(1)elif a<100:print(2)elif a<1000:print(3)elif a<10000:print(4)elif a<100000:print(5)
代碼優化方案——折半
newnumber = int(input('number:'))if newnumber >= 100:if newnumber >= 10000:print(5)elif newnumber >= 1000:print(4)else:print(3)else:if newnumber >= 10:print(2)else:print(1)
代碼優化——使用len内置函數:
newnumber = input('number:')
length=len(newnumber)print(length)
循環結構——while循環和for循環
while文法:
while condition:
block
注:當條件滿足condition為True,進入循環體,執行block
while舉例:
flag = 10
whileflag:print(flag)
flag-= 1
注意邊界,Python整型沒有邊界。
如果将上面代碼改為“flag += 1”便進入死循環。
for文法:
for element in iteratable:
block
注:當可疊代對象中有元素可以疊代,進入循環體,執行block
range函數
for和 range函數舉例:列印1~10
for i in range(10):print(i+1)
Range函數簡介:前包後不包,range(起,止,步長)
例:
range(5) ==> range(0,5)==>[0,5] ==> [0,1,2,3,4]
list(range(0,5,2))>>>[0,2,4]
循環中的 continue語句
中斷目前循環的當次執行,繼續下一次循環;
舉例:計算10以内的偶數(for循環)
for i in range(10):if not i%2:print(i)
#引用range函數的步長
for i in range(0,10,2):print(i)
#引用continue
for i in range(10):if i%2:continue
print(i)
#引用位與運算
for i in range(10):if not i&0x01:print(i)
for i in range(10):if i&0x01:continue
print(i)
循環中的 break語句
終止目前循環
舉例:計算1000以内的被7整除的前10個數(for循環)
count =0for i in range (7,1000,7):print(i)
count+= 1
if count >= 10:break
循環continue、break語句總結:
continue和break是循環的控制語句,隻影響目前循環,包括while、for循環;
如果出現循環嵌套,continue和break也隻影響語句所在的那一層循環;
continue和break不是跳出語句塊,是以if cond:break 不是跳出if,而是終止if外的break所在的循環
for i in range(5):
for j in range(5):
if i>j:
print(666)
continue
if i>=j:
print(555)
break
練習:給定一個不超過5位的正整數,判斷該數的位數,依次列印出個位,十位、百位、千位、萬位的數字
number = int(input('>>>'))
number*= 10
while(number//10)!=0:
number//=10
print(number%10)
number = int(input('>>>'))
numberV=len(str(number))fori inrange(numberV):print(number%10)
number=number//10
将上面的結果反過來列印:
number = int(input('>>>'))
numberV=len(str(number))
c=numberfor i inrange(numberV):
v=10**(numberV-i-1)
m= c //vprint(m)
c-= v*m
循環else子句文法
while condition:
block
else:
block
for element in iteratable:
block
else:
block
##如果循環正常的執行結束,就執行else子句;
##如果使用break終止,else子句不會執行。
for i in range(5):print(i)#if i > 3:
#break
#continue
else:print('OK')
練習:
一個整數,它加上100後是一個完全平方數,再加上168又是一個完全平方數,請問該數是多少?
程式分析:
假設該數為 x。
1、則:x + 100 = n2, x + 100 + 168 = m2
2、計算等式:m2 - n2 = (m + n)(m - n) = 168
3、設定: m + n = i,m - n = j,i * j =168,i 和 j 至少一個是偶數
4、可得: m = (i + j) / 2, n = (i - j) / 2,i 和 j 要麼都是偶數,要麼都是奇數。
5、從 3 和 4 推導可知道,i 與 j 均是大于等于 2 的偶數。
6、由于 i * j = 168, j>=2,則 1 < i < 168 / 2 + 1。
7、接下來将 i 的所有數字循環計算即可。
for i in range(1,85):if 168 % i ==0:
j= 168 /i;if i > j and (i + j) % 2 == 0 and (i - j) % 2 ==0 :
m= (i + j) / 2n= (i - j) / 2x= n * n - 100
print(x)
練習:列印斐波那契數列
程式分析:斐波那契數列(Fibonacci sequence),又稱黃金分割數列。
指的是這樣一個數列如:0、1、1、2、3、5、8、13、21、34、……
程式分析:
F0 =0(n=0)F1 =1(n=1)Fn=F[n-1]+F[n-2](n=>2)
方法一:
deffib(n):
a,b= 1,1
for i in range(n-1):
a,b= b,a+breturna#輸出了第10個斐波那契數列
print(fib(10))
方法二:使用遞歸
#使用遞歸
deffib(n):if n==1 or n==2:return 1
return fib(n-1)+fib(n-2)#輸出了第10個斐波那契數列
print(fib(10))
練習:列印一個邊長為N的正方形
n = 5
print('*'*n)for i in range(n-2):print('*'+' '*(n-2)+'*')print('*'*n)
#邊長=3,則-1 0 -1 =>range(-1,2)#邊長=4,則-2 -1 0 1 =>range(-2,2)#邊長=5,則-2 -1 0 1 2 =>range(-2,3)
n = 5e= -n//2
for i in range(e,n+e):if i == e or i == n+e-1:print('*'*n)else:print('*' + ' '*(n-2) + '*')
練習:求100以内所有奇數的和
b =0for i in range(1,100,2):
b+=iprint(b)
練習:列印九九乘法口訣表
for i in range(1,10):for o in range(1,i+1):print('{}*{}={}\t'.format(i,o,i*o),end='')print()