python3入門與進階(二)

icessun發表於2019-02-16

變數

python3中變數的定義是不固定型別的(動態),區分大小寫

值型別 引用型別
不可變的(值型別) 可變的(引用型別)
int (整型) list (列表)
str (字串) set (集合)
tuple (元組) dict (字典)
  • 通過內建函式id(),可以知道變數在記憶體的位置
b = "icessun"
b = b + "hello"
print(b)
>>> "icessunhello"  # 不是說字串是不可變的嘛?怎麼改變了

如果字串可以改變,那麼可以使用索引值給字串賦值"python"[0] = `h` -----> 報錯,會發現報錯,是不行的。

上面程式的結果是因為,+連線符,把兩個字串連線起來了,連結起來的值重新賦值給了b元素,使用id(b)函式,會發現其實上面兩個b變數在記憶體的位置是不一樣的,所以第一個b變數的值沒有改變,被覆蓋了。

  • 乘方的表示法 :2**5 ----> 2的5次方=32
身份運算子

is / not is

a = (1,2,3)
b = (1,3,2)
print(a is b)    # 元組是不可變的
print(a == b)  # 元組是有序的,值是不相等的
>>> False    False

# 集合
a = {1,2,3}
b = {1,3,2}
print(a==b)  # 集合是無序的,所以值是相等的
print(a is b)
>>> True False

# 字串,數字   兩個取值相等,則is 返回True,但是數字有特殊
a = `icessun`
b = `icessun`
print(a is b)
>>> True

a = 1   
b = 1
c = 1.0
print(a==b)
print(a==c
print(a is b)
print(a is c)
>>> True  True True False

從上面可以看出,元組是不可變的,改變裡面元素的位置就變成了兩個新的元組。is不是比較兩個變數的值是否相等,而是比較變數在記憶體的地址是否相等,算術運算子==是比較值是否相等的

物件的三個特性 一切都是物件
id()函式:變數在記憶體的地址 is :身份運算子
type()函式:型別判斷函式 isinstance(變數,(int,str,float….))
value值的比較 == :算術比較符
成員運算子

判斷一個變數是否在一個變數裡面 in / not in

b= `a`
b in {`c`:1}
>>> False

b=1
b in {`c`:1}
>>> False

b=`c`
b in {`c`:1}
>>> True
  • 優先順序:not > and > or

程式碼編寫

  • 縮排來區分程式碼塊,沒有大括號{ }
  • pass:佔位語句
  • 常量一般大寫
  • 單行註釋:#;推薦在這行語句的開頭寫,與上一條語句有空格
  • 多行註釋: ```註釋內容```
  • 程式碼後面不需要分號,有也可以
  • 例項化一個物件,不需要new關鍵詞
if else / elseif
a = input()
a = int(a)
print(`a is ` + str(a))

if a==1:
    print(`apple`)
elif a==2:
    print(`orange`)
elif a==3:
    print(`banana`)
else:
    print(`shoppingp`)

# 使用 if  else
if a==1:
    print(`apple`)
else:
    if a==2:
        print(`orange`)
    else:
        if a==3:
            print(`banana`)
        else:
            print(`shopping`)

input()接收使用者的輸入,elif功能類似於switch功能;
int(a):因為終端輸入的是字串,所以應該強制轉為數字進行比較
print(`a is ` + str(a)):字串的拼接只能兩者都是字串,否者會報錯

for 變數 in 迴圈體

主要用來遍歷迴圈:序列List,集合Set,字典Dict

a = [[`apple`,`orange`,`banana`,`grape`],(1,2,3)]
for x in a:
    for y in x:
        if y==`orange`:
            break   #  continue
        print(y)  # 預設是換行(print(y,end=`/n`))輸出的,要想不換行:print(y,end=` `);故可以在end裡面新增其他的符號來連線字元
else:
    print(`fruit is gone`)

>>> apple 1 2 3 fruit is gone

break跳出裡面的for迴圈,但是外面的for迴圈沒有跳出,還是會執行;和else配對的是外面的for迴圈,所以依然會執行;要是在外層的for迴圈裡面加入break,那麼就不會執行else語句;for迴圈後面有else語句,當迴圈執行完畢,也會依然接著執行else語句,所以會輸出fruit is gone;一般不推薦在for迴圈後面使用else語句

  • 迴圈中使用range()函式
for x in range(0,10):
    print(x,end=`|`)
>>> 0|1|2|3|4|5|6|7|8|9|

for x in range(10,0,-2):
    print(x,end=`|`)
>>> 10|8|6|4|2|

# 列印列表a中所有的基奇數項
a=[1,2,3,4,5,6,7,8]

# 迴圈+range()函式的方法
for x in range(0,len(a),2):
    print(a[x]) 

# 列表的切片的方法
print(a[0:len(a):2])

>>> [1,3,7]

range()函式的作用類似於其他語言中的for(i = 初始值;i < 長度;i ++);裡面可以傳入兩個或者三個引數,兩個引數的時候表示的是:初始值,長度;傳入三個引數的時候表示的是:初始值,長度,步長

序列解包
def ice(a,b):
    a1=a*3
    b1=b*2+10
    return a1,b1

ice_a1,ice_b1 = ice(3,6)
print(ice_a1,ice_b1)
>>> 9 22

a=1
b=2                ====>    a,b,c=1,2,3  或者  (1,2,3)  當abc都相等的時候:a=b=c=1 或者 a,b,c=1,1,1
c=3

序列解包:就是當一個函式有多個返回值的時候,不需要使用一個變數接收到所有的返回值,然後又重新遍歷返回值,取到對應的返回值;只需要使用和返回值個數對等的變數依次接收就行;當然只是針對返回值是值型別的函式。個數相等,順序對應

當在函式引數裡面使用的時候,可以在實參裡面修改預設值;在呼叫函式傳入引數的時候,明確告訴實參,形參給傳的是那個實參的值sum(y=3,x=2)

相關文章