Python3學習(一)-基礎、數據類型、變量、字符串和編碼、list&tuple、if、for、while、dict、set、函數與參數

##廖雪峯py3筆記

## '//'這是得到相除後的整數部分
##a = 10//3
##print (a)

## '/'得到相除後的結果,爲浮點數,結果能整除也也是浮點數
##b = 10/3
##print(b)
##c = 9/3
##print (c)

##輸入輸出
##name = input('please enter your name:')
##print('hello,',name)
##結果:
##please enter your name:jianweiwei
##hello, jianweiwei

##編碼
##美國字母數據是用的ascii編碼,佔用一個字節,unicode 是世界公用編碼,佔用4個字節,Utf_8是新的
##國際編碼標準,能夠根據字符所的編碼難易程序,來分配對應的長度,如,在Utf-8中,英文字母是佔用1個字節,
##中文佔用3個字節。

##py字符串
##對於單個字符的編碼,ord()函數獲取字符的整數表示,chr()函數把編碼轉換爲對應的字符。
##ord('a')#97
##print(ord('a'))
##print(ord('中'))#20013
##print(chr(88))#X
##print(chr(25991))#文

##py的字符串類型是str,在內存中以Unicode表示,一個字符對應若干個字節,若是要在網絡上傳輸,或者保存到
##保存到磁盤上,就須要把str變爲以字節爲單位的bytes.
##對bytes類型的數據用帶b前綴的單引號或雙引號表示:
##x = b'ABC'#表示bytes類型的數據,每一個字符只佔一個字節,‘ABC’表示str字符串,用Unicode編碼
##print(x)#結果:b'ABC'

##以Unicode表示的str經過encode()(編碼)方法能夠編碼爲指定的bytes,例如:
##x = 'ABC'.encode('ascii')
##print(x)#結果b'ABC',表示把str類型的'ABC'編碼爲b'ABC'的以字節爲單位的bytes類型的
##x = '中文'.encode('utf-8')
##print(x)#結果:b'\xe4\xb8\xad\xe6\x96\x87',把中文變成了bytes.
##x = '我愛大樹'.encode('utf-8')
##print (x) #b'\xe6\x88\x91\xe7\x88\xb1\xe5\xa4\xa7\xe6\xa0\x91'

##純英文的str能夠用ASCII編碼爲bytes,含有中文的str能夠用utf-8編碼爲bytes,含有中文的str沒法用ASCII編碼,由於
##中文編碼範圍超過了ASCII的。在bytes中,沒法顯示爲ASCII的字節,用\x##表示,
##反過來,若是咱們從網絡或磁盤上讀取了節節流,那麼讀的數據就是bytes。要把bytes轉爲str,yi
##須要用decode()方法
##x = b'ABC'.decode('ascii')
##print (x)#結果ABC,說明已經把字節的b'ABC'轉化爲str的'ABC'
##x = b'\xe6\x88\x91\xe7\x88\xb1\xe5\xa4\xa7\xe6\xa0\x91'.decode('utf-8')
##print (x) #我愛大樹'

##len()用來計算str字符串的字符數,還能夠來用計算bytes數據的字節數。
##print (len(b'ABC'))#3說明,一個bytes佔用一個字節,而一個英文字符佔用1個字節。一箇中文佔用3個字節
##print (len('ABC'))#3
##print (len(b'\xe6\x88\x91\xe7\x88\xb1\xe5\xa4\xa7\xe6\xa0\x91'))#12

##py源碼也是文本文件,當源碼中包含中文時,在保存源碼時,就須要務必指定保存爲utr-8能夠在文件開頭時寫上
##   #!/usr/bin/env python3
##   #-*- coding:utf-8 -*-
##上面第一行是爲了告訴Linux/osx系統,這是一個py可執行程序,在windows能夠不用寫,第二行是說用utf-8讀取代碼。

##py中的格式化,用%實現。
##strHi = 'hello,%s'%'world'#在前面字符串中的%s被後面%後的字符串替換。
##print (strHi)
##當要替換的內容比較多時,後面的%號用括號括起來,用,進行分隔。
##常見的點位符有:
##%d 整數
##%f 浮點數
##%s 字符串
##%x 16進制整數
##其中,格式化整數和浮點數還能夠指定是否補0和整數與小數的位數。
##x = '%2d-%02d' % (3,1)
##print (x)# 3-01
##x = '%.2f' % 3.1415926
##print (x)#3.14
##當爲了表示在字符中的一個普通的'%',能夠用%%來進行轉義,

##練習
##x = (85-72)/72*100
##print('小明的成績提高了%.1f%%'%x) #小明的成績提高了18.1%


##py中的list
##classmates = ['a','b','c','d','e']#用[]表示。
##x = len(classmates)#用len()函數能夠獲得list的長度,前面也能夠獲得str,bytes的長度,字節數量
##print(x)#5
##print(classmates[2])#能夠獲得指定位置上的元素c。
##print(classmates[len(classmates)-1])#list最後一個元素用len(list)-1來表示位置。
##print(classmates[-1])#e,也可能用-1來表示最後一個元素,同理[-2]表示最後第二個。
##classmates.append('f')#把f加到最後一個位置上
##classmates.insert(1,'0')#把0加入到索引爲1的位置。
##classmates.pop()#刪除最後一個元素。
##classmates.pop(3)#刪除指定位置爲3的元素。
##classmates[2] = 'k'#把索引位置爲2的元素換爲'k'
##print(classmates)
####list中也能夠添加另外一個list
##classmates.insert(1,[1,3,4])
##print(classmates)
##print(classmates[1])
##
##a = []
##print(len(a))#0,表示空的list

##tuple元組,有序列表,一旦初始化就不能修改,這樣數據更安全,因此能用tuple不用list
##classmates = ('x','y','z')
##print(classmates[0])#'x'
###因爲tuple不能被修改,因此list中的insert,pop,等一些修改,替換的方法在元組中都不能用。
#當定義的爲一個元素時
##t = (1)#這時與數據運算中()會有歧義,Py規定這時按數學運算記,t爲1.而不是元組。能夠改變。
##tupleDemo = ('1','23',[22,33])#表示一個元組裏包含一個list,這時元組的元素仍是不能改變,可是元組中的list
#元素的內容是改變的,應該加以區分。

####練習
##L = [['apple','google','microsoft'],['java','py','puby','php'],['adam','bart','lisa']]
##print(L[0][0])
##print(L[1][1])
##print(L[2][2])


##條件判斷:if,和java同,就再也不詳細記錄主要是注意格式,縮進。
##if x :
##    print()
##elif y :
##    if l :
##        print()
##    elif m : 
##        print()
##    else :
##        print()
##else :
##    print()

##for循環,py中的for循環與java中的超級for循環相似,把要循環的對象分別賦值給變量。
##ziMu = ['a','b','c','d']
##for zi in ziMu :
##    print(zi) #a b c d
##range(i)生成一個從0到小於i的一個整數序列。
##sum = 0
##for ii in range(100):
##    sum = sum+ii
##print (sum)

##while循環
##while x:
##    print()
##    if l:
##        break

##dict全稱是dictionary字典,在java中被稱爲map,有健值對。查找速度快,是能過健值查找,比list快。
##d = {'a':111,'b':222,'c':333,'d':444}
##d['a']#111.
###d[f]由於沒有f這個健,因此會報錯,所以能夠用下面方法:
##if 'f' in d :
##    print(d['f'])
###或
##d.get('f')#當’f'不存在時,會返回None
###要刪除一個key,用
##d.pop('c')#同時,'c'對應的value值也會被刪除掉。

##list與dict相比,dict的特色:
#1.查找與插入速度快,不會隨着key的增長變慢。
#2.要佔用大量的內存,
#list則查找與插入時間會隨元素數量的增長而增長。但內存佔用相對較少。

#dict的key不能改變,否則獲得的value的內存位置就會改變,value也會改變。所以做爲key的類型爲
#不能夠改變的類型,str,整型,但list不能做爲key.

####set
###也是 組key的集合,但不存儲value,像在dict中同樣,key一樣不能重複。要建立set,須要提供一個list做爲
###輸入集合
##s= set([1,2,3,4,5,3443])
##print(s)#{1, 2, 3, 4, 5, 3443},能夠看到是大括號,list是[]。同時,set中的元素是無序的。
###set會自動過濾list中的重複元素。
##q = set([1,1,1,3,3,3,2,2,222222,5,5,])
##print(q)#{1, 2, 3, 5, 222222}能夠看到,重複元素被過濾了,
##q.remove(222222)#
##print(q)#{1, 2, 3, 5}用remove(key)來刪除一個key
###由於set中的元素不能重複,因此能夠爲兩個序列取交集,並集操做。
##s1 = set([1,2,3])
##s2 = set([2,3,4])
###取交集
##print(s1 & s2)#{2, 3}
###取並集
##print(s1 | s2)#{1, 2, 3, 4}
###set與dict同樣,不能夠放入可變對象,由於沒法判斷兩個可變對象是否相等。
###嘗試把list放入set
###s1[0] = [1,2,3]#TypeError: 'set' object does not support item assignment
###print (s1[0])

###不可變對象:
###str是不可變對象,list是可變對象。
##a = ['b','a','d','e','c']
##a.sort()
##print(a)#['a', 'b', 'c', 'd', 'e'],a變成有序的了,說明內容可變。
##a = 'abc'
##a.replace('a','A')
##print (a)#abc,說明a沒有變,可是沒有變爲是可使用replace()方法呢。
##a = 'abc'
##b = a.replace('a','A')
##print(b)#Abc,能夠理解爲:a只是一個變量,指向一個內存地址,其中放着字符串'abc',a.replace('a','A')
###方法沒有改變'abc',而是從新生成一個新的字符串'Abc',b指向了這個新的字符串,a仍是指向'abc'


####函數
##x = -2
##abs(x)#求絕對值,當傳入的參數的個數不對,會報Typeerror錯誤。
##y = 5
##max(x,y)

###數據類型轉換
##print(int('123'))#123,把str類型的’123‘轉換爲整數123
##print(float('12.34'))#12.34
##print(str(12.34))#'12.34',
##print(bool(1))#True
##print(bool(''))#False
###像abs()函數中的abs函數名稱實際是指向一個函數對象的引用,徹底能夠把函數名賦給一個變量,至關於
###給函數起了個別名。
##a = abs
##print(a(-30))
##b = max
##print(b(18,80))

####練習
##print(str(hex(30)))#0x1e,把30轉換成16進製表示的字符串。


####函數的定義
###Py中函數定義用def 函數名(參數):函數體,return 返回值
##def my_abs(x):
##    if x>=0:
##        return x
##    else :
##        return -x
##print(my_abs(-10))
###py中能夠傳入多個參數,而且有多個返回值。
##def manyData(a,b,c):
##    x = b+c
##    y = a+b
##    z = a+c
##    return x,y,z
##print(manyData(1,2,3))#返回的多個參數是以元組的形式返回的。
###return,當return後,函數就被結束了執行,當return None,返回就是爲空,也能夠寫成return
###空函數:
###pass,當函數體爲空時,能夠用pass結束,返回爲None,用pass語句什麼都不作,點位符用。當尚未想
###想好函數體怎麼寫是,用pass.
##def getAge(age):
##    if age>=10:
##        pass
##getAge(13)
###當調用 一個函數時,傳入的參數是一個錯誤的類型,或參數的個數不對時,就會報TypeError錯誤。
##def my_abs1 (x):
##    if not isinstance(x,(int,float)):
##        raise TypeError('bad operand type')
##    if x>=0:
##        return x
##    else :
##        return -x
####print(my_abs1('11'))#當傳入的參數類型不正確時,就會報raise 後面的定義的錯誤。
##print(my_abs1(-11))


##函數的參數
#位置參數
def power(x,n):
    s = 1
    while n>0:
        s = s*x
        n = n-1
    return s
print(power(12,3))#這裏的x,n都是被指定好位置的,叫位置參數。調用時,要依次傳入參數。

#默認參數
def moren(x,n = 3):
    s = x+n
    return s
print (moren(1))#4,這裏能夠看到,函數定義了兩個參數,但調用函數時,只傳入了一個參數,n沒有
#傳入參數值,但也沒有報錯,原函數裏的 n=3就是默認參數,當不傳入n的參數值時,就使用默認值,
#而傳入n的參數值時,就會使用傳入的參數。
print(moren(1,10))#11
print(moren(3))
#默認參數通常放在函數非默認參數的後面,默認參數通常爲變化量不大的參數。
#默認參數必須指向不變的對象,上面n = 3,是把n 指向3這個不變的數字。
#當默認參數指向一個可變的對象時:
def kebian(b = []):
    b.append('X')
    return b
print(kebian())#['X']
print(kebian())#['X', 'X'],能夠看到,當默認參數指向一個可變對象時,執行一樣語句,內容確
#有變化,這是什麼緣由呢:由於變量b指向對象[]的引用地址,地址不會變,但[]中的內容是可變的,
#當第一次執行參數時,[]list,內容就變成了['x'],再次執行時,就會往同一地址指定的[]中再加入一
#次'x',這樣就會導入不但願出來的結果。

#可變參數
def kebian(*nums):#接收時用'*'加一個變量名,表示接收可變參數。
    s = 0;
    for num in nums:
        s = s+num
    return s
print(kebian(1,3,4,3,2,3,3))#可變參數就是用來表示參數個數不肯定的函數。傳入的參數,是由
#list或tuple演變簡寫成這種樣式的。
相關文章
相關標籤/搜索