1. 程式人生 > >python學習之路-基本資料型別1 變數的概念、數字、字串

python學習之路-基本資料型別1 變數的概念、數字、字串

1 什麼是資料型別?

每種程式語言都有自己的資料型別,用於標識計算機可以認識的資料,Python中主要的資料型別為字串,整數,浮點數,列表,元祖,字典,集合七種主要的資料型別,其中以列表,字典為最主要的資料型別。

2 什麼是變數?

在說資料型別之前,首先說一下變數,那什麼是變數?簡單講,變數就是一個容器,用來裝東西的,可以裝不同的東西。如一個瓶子,可以拿去裝醬油,也可以拿去裝可樂;其中瓶子就是一個變數,我們可以給瓶子起個名字,就是變數名,而瓶子中裝的醬油和可樂就是不同的資料型別。

2.1 變數及其命名規則

2.1.1變數的命名規則
  • 只允許使用字母、數字和下劃線。
  • 變數名可以字母或下劃線打頭,但不能以數字打頭,例如,可將變數命名為message_1,但不能將其命名為1_message。
  • 變數名不能包含空格,但可使用下劃線來分隔其中的單詞。例如,變數名greeting_message可行,但變數名greeting message會報錯。
  • 不要將Python關鍵字和函式名用作變數名,即不要使用Python保留用於特殊用途的單詞,如print。
  • 變數名應既簡短又具有描述性。例如,name比n好,student_name比s_n好,name_length比length_of_persons_name好。
  • 慎用小寫字母l和大寫字母O,因為它們可能被人錯看成數字1和0。
2.1.2 變數的命名原則
  • 駝峰式
  • 下劃線式
2.1.3 使用變數時避免命名錯誤

名稱錯誤通常意味著兩種情況:

  • 要麼是使用變數前忘記了給它賦值,
  • 要麼是輸入變數名時拼寫不正確。

3 python中的資料型別

下面將Python中主要的資料型別分數字,字串,列表,元祖,字典,集合六種型別進行總結。

3.1 數字

Python的數字也有4中不同的型別,分別是:整數(int)、浮點數(float)、布林值(bool)、複數(complex)。
Python將帶小數點的數字都稱為浮點數。

3.1.1 整數

簡單理解,整數就是沒有小數點的數!例如0,-1,23333333,整數的準確概念可參考該內容
Python中的整數又有不同的進位制,如十進位制,二進位制,十六進位制,八進位制。
現在不懂進位制沒關係,想了解的話可以百度,我就不長篇大論了。

他們之間的相互轉化可以參考該內容

  • 十進位制寫法就是正常寫法;
  • 二進位制寫法加字首0b,且只能出現0 1兩種數字的組合,例如:0b1001110;
  • 八進位制寫法加字首0o,出現0~7數字組合,例如0o76543210;
  • 十六進位制寫法加字首0x,出現0~9和A~F的數字和字母組合,例如0xA20974BCF;
    執行時,他們會自動轉為十進位制輸出結果,我們試試:
print(0b100110)  # 二進位制
# 結果:38

print(0o7654321)  # 八進位制
# 結果:2054353</pre>

print(0xA20974BCF)  # 十六進位制
# 結果:43496459215

print(0xABCD)  # 十六進位制
# 結果:43981
3.1.2 浮點數

簡單點說,浮點數就是帶小數點的數字。
劃重點:浮點數只能以十進位制方式書寫,也就是不加字首。

3.1.3 整數型與浮點型的區別

整數型和浮點型都是數字,區別在於:

  • 整數型對應的是數學中的整數;
  • 浮點型可以看作是實數(暫不考慮精度問題),即帶小數點的數。
    在python中數字5 和5.0使用不同的資料型別表示,數字5為整數型,5.0為浮點型。
3.1.4 布林值

布林值就是我們常說的邏輯值,可以理解為對或者錯,正面與反面。

3.1.5 複數

複數是什麼?
有理數和無理數統稱實數,在實數之外還有一種叫複數,一般用不到,瞭解一下就可以了。
在Python中,複數是這樣表示的:

 print(1+1j)
# 結果:(1+1j)

print(type(1+1j))
# 結果:complex
3.1.6 可以使用type()函式來檢視變數的型別
type(10)
# 結果:int

type(10.3)
# 結果:float

print(type('10.3'))
# 結果:str
3.1.7 可以使用 isinstance()函式來判斷變數是否為某一型別
print(isinstance(2,int))
# 結果:True

print(isinstance(2.0,int))
# 結果:False

3.2 字串

3.2.1 字串的定義

在Python中,用引號包起的都被稱為字串,其中引號可以是單引號(‘’),也可以是雙引號(“”)和三引號(''' ''' 或""" """)

name = 'zhang san'
str = 'good morning!'

print(str,name)
# 結果:goodmorning! zhang san
3.2.2 字串的格式化輸出

在很多時候,我們需要在字串中放置變數,然後用變數的值替換,python中字串的格式化輸出有兩種方式:

3.2.2.1使用%() 實現字串格式化輸出

具體使用方法如下:

name = 'zhang san'
age = 22
job = 'student'
str = "my name is %s,I'm %d years old,I'm a %s." %(name,age,job)
print(str)
# 結果:my name is zhang san,I'm 22 years old,I'm a student.

其中%s代表字串變數,%d代表整數型變數。

常見的格式化字元:

格式 描述
%% 百分號標記 ,就是輸出一個%
%c 字元及其ASCII碼
%s 字串
%d 有符號整數(十進位制)
%u 無符號整數(十進位制)
%o 無符號整數(八進位制)
%x 無符號整數(十六進位制)
%X 無符號整數(十六進位制大寫字元)
%e 浮點數字(科學計數法)
%E 浮點數字(科學計數法,用E代替e)
%f 浮點數字(用小數點符號)
%g 浮點數字(根據值的大小採用%e或%f)
%G 浮點數字(類似於%g)
%p 指標(用十六進位制列印值的記憶體地址)
%n 儲存輸出字元的數量放進引數列表的下一個變數中

其中,最常用的為%s,%d,%f,%e。

3.2.2.2 使用format()函式實現字串格式化輸出
name = 'zhang san'
age = 22
job = 'student'

# 方式一:
str = "my name is {name},I'm {age} years old,I'm a {job}." .format(name=name, age = age, job = job)
print(str)
# 結果: my name is zhang san,I'm 22 years old,I'm a zhang san.</pre>

# 方式二:
str = "my name is {0},I'm {1} years old,I'm a {2}." .format(name, age, job)
print(str)
# 結果: my name is zhang san,I'm 22 years old,I'm a zhang san.

其他用法:

age = 25
name = 'Caroline'

print('{0:.3} is a decimal. '.format(1/3))  # 小數點後三位
# 結果:0.333 is a decimal.

print('{0:_^11} is a 11 length. '.format(name))  # 使用_補齊空位
# 結果:_Caroline__ is a 11 length.

print('My name is {0.name}'.format(open('out.txt', 'w')))  # 呼叫方法
# 結果:My name is out.txt

print('My name is {0:8}.'.format('Fred'))  # 指定寬度
# 結果:My name is Fred
3.2.3 轉義

轉義轉義,顧名思義,就是轉換含義,通俗的說就是改變原來的意思
Python用反斜槓()來轉義字元

轉義字元 描述
(在行尾時) 續行符
\ 反斜槓符號
' 單引號
" 雙引號
\a 響鈴
\b 退格(Backspace)
\e 轉義
\000
\n 換行
\v 縱向製表符
\t 橫向製表符
\r 回車
\f 換頁
\oyy 八進位制數,yy代表的字元,例如:\o12代表換行
\xyy 十六進位制數,yy代表的字元,例如:\x0a代表換行
\other 其它的字元以普通格式輸出
3.2.4.字串常用操作方法

對字串的操作,常用的操作主要包括檢視字串長度,索引和切片,分割和拼接字串,字串格式的判斷和修改,字串填充,字串子串的查詢和替換等操作

3.2.4.1 檢視字串長度

用len()函式檢視字串的長度

a = 'zhang san'
print(len(a))
# 結果:9

b = "你好"
print(len(b))
# 結果:2

由上面兩個例子可以看出,len()函式檢視的是字串中字元的數量,其還可以檢視列表,元祖,字典中的長度,下面會提到。

3.2.4.2 提取字串中的子串(索引和切片)

單個字串的提取用索引,多個字串的提取用切片
字串的索引:
Python有兩種索引方式:

  • 從前往後的正向索引:有m個字元長度的字串,索引值是0~m-1(計算機很多都是從0開始標序號的)
  • 從後往前的負數索引:有m個字元長度的字串,索引值是-1~-m
name = 'zhangsan'
print(name[0])
# 結果:'z'

name = 'zhangsan'
print(name[-3])
# 結果: 's'

字串的切片:
切片:顧名思義,就是把東西切成片,如果把字串看成一根黃瓜,切片就是切出一個黃瓜片,黃瓜片的厚度就代表了切出來的字串的長度。
我們來想一下,如果要從一根黃瓜裡面切出一個黃瓜片,一般是要切兩刀,在黃瓜的某個位置切一刀,然後根據所需黃瓜片的厚度,在另外的一個位置再切一刀,黃瓜片就產生了。當然,如果我們從頭開始切,那第一刀就不用切了,只要根據想要黃瓜片的厚度在相應位置切一刀就可以產生一個黃瓜片,同理,我們想要黃瓜的結尾部分,只要切一刀就可以了,後面的部分也是一個黃瓜片。所以,切片的語法就類似我們切黃瓜片,需要三個引數,開始的位置,結束的位置,每刀切多厚。
切片標準的寫法是用兩個冒號分割三個數字,代表的意思分別是:

  • 第一個數字表示切片的開始位置(索引),可以為正值也可以為負值(參考字串索引的用法),省略為0,即索引為0開始取。
  • 第二個數字表示切片的截至位置,但是不包括這個位置,也就是切到它的前一個位置結束(索引),可以為正值也可以為負值,省略代表取到最後。
  • 第三個表示切片的步長(切片的厚度),當省略步長時候,預設為1,可以省略,省略後冒號也可以省略,也可以為負數,代表逆序取。
    三個數全部省略,表示取字串的全部,相當於沒切。
name = 'zhang san'

print(name[1:4] ) # 從第2個位置切到第4個位置
# 結果:'han'
print(name[1:4:2])  # 從第2個位置切到第4個位置,步長為2
# 結果:'hn'
print(name[1:]) # 從第2個位置切到最後
# 結果:'hang san'
print(name[::])  # 切出所有
# 結果:'zhang san'
print(name[::2] ) # 切出所有,步長為2
# 結果: 'zagsn'
print(name[::-1])  # 逆序字串
# 結果: 'nas gnahz'
print(name[:5]) # 切出前5個字元
# 結果:'zhang'
3.2.4.3 字串分割

1)、根據指定的分隔符將字串分割為前,中,後三部分
一般為指定的分隔符前面為1部分,分隔符為一部分,剩下的為一部分 ,返回一個含有三個元素的元祖
partition(self, sep)方法從左面開始
rpartition(self, sep)方法從右面開始

name = 'zhangsan,lisi,wangwu,maliu'
name.partition("a")
# 結果: ('zh', 'a', 'ngsan,lisi,wangwu,maliu')

2)、根據指定的分割符分割,預設分隔符為空格
指定分隔符和最多分割幾次,預設不限次數,返回的是列表
split(self, sep=None, maxsplit=None): 分割,從左側開始,返回的是列表
rsplit(self, sep=None, maxsplit=None): 分割,從右側開始,返回的是列表
splitlines(self, keepends=False):根據換行符進行分割,返回列表

name = """zhangsan,lisi,wangwu"""
print(name.split(sep = 'a',maxsplit=1))
# 結果:['zh', 'ngsan,lisi,wangwu']

name = """zhangsan,lisi,wangwu"""
print(name.rsplit(sep = 'a',maxsplit=1))
# 結果:['zhangsan,lisi,w', 'ngwu']

name = """zhangsan
lisi
wangwu
"""
print(name.splitlines())
# 結果: ['zhangsan ', 'lisi ', 'wangwu']
3.2.4.4 字串拼接

1)、兩個字串拼接可以使用加號(+)來實現,如果想要將列表中的字串全部拼接起來,可以使用join()方法。

'my' +' '+ 'name' + ' '+ 'is' + ' ' + 'zhangsan'
# 結果: 'my name is zhangsan'

2)、join(self, iterable): 使用指定的連線符,將傳入的列表中的各元素連線在一起

s = ','
a = s.join(['lisi','wangwu','maliu'])
print(a)
# 結果:  'lisi,wangwu,maliu'

join方法和split方法是相反的操作:

name = ['lisi', 'wangwu', 'maliu']

s = ','
a = s.join(['lisi', 'wangwu', 'maliu'])
print(a)
# 結果:lisi,wangwu,maliu

b = a.split(s)
print(b)
# 結果:['lisi', 'wangwu', 'maliu']
3.2.4.5 對字串的格式進行判斷和修改

1)、判斷字串是否為某種格式:

  • islower(self) 判斷字串是否為小寫
  • isspace(self) 判斷字串是否為空字串
  • istitle(self) 判斷字串是否為標題格式的字串
  • isupper(self) 判斷字串是否全為大寫
  • startswith(self, prefix, start=None, end=None) 判斷字串是否是以某個子串起始
  • endswith(self, suffix, start=None, end=None) 判斷字串是否以某個子串結束
  • isalnum(self): 是否是字母和數字
  • isalpha(self): 是否是字母
  • isdigit(self): 是否是數字

2)、使用方法修改字串的格式:

  • title(self)以首字母大寫的方式顯示每個單詞,即將每個單詞的首字母都改為大寫。
  • upper(self)將字串改為全部大寫
  • lower(self)將字串改為全部小寫
  • capitalize(self)將首字母變為大寫
  • def swapcase(self) 字串大寫變小寫,小寫變大寫 """
name = 'zhang san'
job = 'IT'

print(name.title())
# 結果:Zhang San

print(name.upper())
# 結果:ZHANG SAN

print(job.lower())
# 結果:it

print(name.capitalize())
# 結果:Zhang san

print(name.title().swapcase())
# 結果:zHANG sAN
3.2.4.6 字串填充及刪除空白的相關方法

1)、使用製表符或換行符來新增空白

  • 要在字串中新增製表符,可使用字元組合\t
  • 要在字串中新增換行符,可使用字元組合\n
print('hello,zhang san')
# 結果:hello,zhang san

print('hello,\nzhang san')
# 結果:hello,
#            zhang san

print('hello,\tzhang san')
# 結果:hello,    zhang san

2)、 刪除空白

  • rstrip():刪除字串末尾的空白,並不改變原變數值
  • lstrip():刪除字串開頭的空白
  • strip():同時刪除 字串開頭和末尾的空白
name = '    zhang san    '

print('|' + name+'|',len(name))
# 結果: |    zhang san    | 17
print('|' + name.rstrip()+'|',len(name.rstrip()))
# 結果: |    zhang san| 13
print('|' + name.lstrip()+'|',len(name.lstrip()))
# 結果:|zhang san    | 13
print('|' + name.strip()+'|',len(name.strip()))
# 結果:|zhang san| 9

3)、將字串填充為指定的長度

  • center(self, width, fillchar=None)將字串填充為指定的長度,並將字串置於中間,fillchar引數指定填充的符號,預設為空
  • ljust(self, width, fillchar=None)將字串填充為指定的長度,並將字串置於左側,fillchar引數指定填充的符號,預設為空
  • rjust(self, width, fillchar=None)將字串填充為指定的長度,並將字串置於右側,fillchar引數指定填充的符號,預設為空
  • zfill(self, width):返回指定長度的字串,原字串右對齊,不滿指定的長度,在前面填充0。
name = 'zhangsan'

print(name.center(50,'-'))
# 結果:---------------------zhangsan---------------------
print(name.ljust(50,'*'))
# 結果:zhangsan******************************************
print(name.rjust(50,'*'))
# 結果:******************************************zhangsan

print(name.zfill(20))
# 結果:000000000000zhangsan
3.2.4.7 對字串的子串進行操作

1)、計算字串中子串的個數
count(self, sub, start=None, end=None) 用於統計字串中某個子串的個數,start為開始查詢位置,end為結束查詢位置,但不包括該位置。

name = 'zhangsan'
print(name.count('a'))  # 找’zhangsan‘這個字串中有幾個‘a’
# 結果: 2

name = 'zhangsan'
print(name.count('a',3))  # 從’zhangsan‘這個字串的第三個位置即n開始找字串中有幾個‘a’
# 結果:1

name = 'zhangsan'
print(name.count('a',3,6))  # 從’zhangsan‘這個字串的第三個位置(即n)開始,第6個位置(即a)結束(不包含)找字串中有幾個‘a’
# 結果:0

2)、尋找字串中子串的位置
用於尋找字串中的子串的索引位置,如果有多個以第一個找到為準。結果從0開始,如果沒找到返回-1
find(self, sub, start=None, end=None): 從左側開始找
rfind(self, sub, start=None, end=None): 從右側開始找


name = 'zhangsan'
name.find('a')
# 結果: 2

name = 'zhangsan'
name.find('saw')
# 結果“: -1

name= 'zhangsan'
name.rfind('a')
# 結果: 6

用於尋找字串中的子串的索引位置,如果有多個以第一個找到為準。結果從0開始,如果沒找到報錯
index(self, sub, start=None, end=None): 從左側開始找
rindex(self, sub, start=None, end=None): 從右側開始找

name= 'zhang san'
name.index('an')
# 結果:2

name= 'zhang san'
name.rindex('an')
# 結果:7

3)、替換字串中子串的內容
replace(self, old, new, count=None): 將字串中的子串替換為另外的子串

name= 'zhang san'
name.replace('a','e')
# 結果: 'zheng sen'

4)、將tab轉換成空格,預設一個tab轉換成8個空格
expandtabs(self, tabsize=None):

name = 'zhang\tsan'
names = name.expandtabs()
print(names)
# 結果: 'zhang   san'
3.2.4.8 字串編碼問題

在python中,字元編碼普遍認為是個很麻煩的事情,只要記住unicode是萬國碼,其他任何其他編碼形式想要相互轉換編碼格式,都需要先解碼成unicode,然後再編碼成想要轉換的編碼格式。
將字串解碼為unicode格式
decode(self, encoding=None, errors=None):

將unicode格式的字串編碼為指定的編碼格式
encode(self, encoding=None, errors=None):

其他方法:
translate(self, table, deletechars=None) 轉換
需要先做一個對應表,最後一個表示刪除字元集合

intab = "aeiou"
outtab = "12345"
trantab = str.maketrans(intab, outtab)
str = "this is string example....wow!!!"
print (str.translate(trantab))
# 結果: th3s 3s str3ng 2x1mpl2....w4w!!!