編程語言與Python學習(二)

来源:http://www.cnblogs.com/x-y-j/archive/2017/12/14/8039749.html
-Advertisement-
Play Games

1.1 流程式控制制之for迴圈 1 迭代式迴圈:for,語法如下 for i in range(10): 縮進的代碼塊 2 break與continue(同上) 3 迴圈嵌套 for i in range(1,10): for j in range(1,i+1): print('%s*%s=%s' % ...


1.1 流程式控制制之for迴圈

1 迭代式迴圈:for,語法如下 

for i in range(10):

 

    縮進的代碼塊

 

 

2 break與continue(同上)

3 迴圈嵌套

for i in range(1,10):

    for j in range(1,i+1):

        print('%s*%s=%s' %(i,j,i*j),end=' ')

    print()

 

for+else

 

 

1.2 開發工具IDE

1.2.1 為何要用IDE

到現在為止,我們也是寫過代碼的人啦,但你有沒有發現,每次寫代碼要新建文件、寫完保存時還要選擇存放地點,執行時還要切換到命令行調用python解釋器,好麻煩呀,能否一氣呵成,讓我簡單的寫代碼?此時開發工具IDE上場啦,一個好的IDE能幫你大大提升開發效率。

很多語言都有比較流行的開發工具,比如JAVA 的Eclipse, C#,C++的VisualStudio, Python的是啥呢? Pycharm,最好的Python 開發IDE

1.2.2 安裝

下載地址:https://www.jetbrains.com/pycharm/download 選擇Professional 專業版 

Comunnity社區版是免費的,但支持的功能不多,比如以後我們會學的Django就不支持,所以還是用專業版,但專業版是收費的,一年一千多,不便宜。唉,萬能的淘寶。。。不宜再多說啦。

 註冊完成後啟動,會讓你先創建一個項目,其實就是一個文件夾,我們以後的代碼都存在這裡面

 

 

圖1-1  

1.2.3 創建目錄

你以後寫的項目可能有成百上千個代碼文件 ,全放在一起可不好,所以一般把同樣功能的代碼放在一個目錄,我們現在以天為單位,為每天的學習創建一個目錄day1,day2,day3...這樣

 

 

圖1-2  

1.2.4 創建代碼文件

 

 

圖1-3  

1.2.5 執行代碼

 

 

圖1-4  

 

1.3 數據

1.3.1 什麼是數據?

  x=10,10是我們要存儲的數據

 

1.3.2 為何數據要分不同的類型

  數據是用來表示狀態的,不同的狀態就應該用不同的類型的數據去表示

1.3.3 數據類型

l  數字(整形,長整形,浮點型,複數)

l  字元串

l  位元組串:在介紹字元編碼時介紹位元組bytes類型

l  列表

l  元組

l  字典

l  集合

 

1.4 數字

整型與浮點型

複製代碼

#整型int

  作用:年紀,等級,身份證號,qq號等整型數字相關

  定義:

    age=10 #本質age=int(10)

#浮點型float

  作用:薪資,身高,體重,體質參數等浮點數相關

    salary=3000.3 #本質salary=float(3000.3)

#二進位,十進位,八進位,十六進位

複製代碼

其他數字類型(瞭解)

複製代碼

#長整形(瞭解)

    在python2中(python3中沒有長整形的概念):      

   >>> num=2L

    >>> type(num)

    <type 'long'>

 

 

1.5 字元串

#作用:名字,性別,國籍,地址等描述信息

 

#定義:在單引號\雙引號\三引號內,由一串字元組成

name='egon'

#優先掌握的操作:

#1、按索引取值(正向取+反向取) :只能取

#2、切片(顧頭不顧尾,步長)

#3、長度len

#4、成員運算in和not in

#5、移除空白strip

#6、切分split

#7、迴圈  

 

1.5.1 需要掌握的操作

複製代碼

#1、strip,lstrip,rstrip

#2、lower,upper

#3、startswith,endswith

#4、format的三種玩法

#5、split,rsplit

#6、join

#7、replace

#8、isdigit

 

#strip

name='*egon**'

print(name.strip('*'))

print(name.lstrip('*'))

print(name.rstrip('*'))

 

 

#lower,upper

name='egon'

print(name.lower())

print(name.upper())

 

 

#startswith,endswith

name='alex_SB'

print(name.endswith('SB'))

print(name.startswith('alex'))

 

 

#format的三種玩法

res='{} {} {}'.format('egon',18,'male')

res='{1} {0} {1}'.format('egon',18,'male')

res='{name} {age} {sex}'.format(sex='male',name='egon',age=18)

 

 

#split

name='root:x:0:0::/root:/bin/bash'

print(name.split(':')) #預設分隔符為空格

name='C:/a/b/c/d.txt' #只想拿到頂級目錄

print(name.split('/',1))

 

 

name='a|b|c'

print(name.rsplit('|',1)) #從右開始切分

 

 

#join

tag=' '

print(tag.join(['egon','say','hello','world'])) #可迭代對象必須都是字元串

 

 

#replace

name='alex say :i have one tesla,my name is alex'

print(name.replace('alex','SB',1))

 

 

#isdigit:可以判斷bytes和unicode類型,是最常用的用於於判斷字元是否為"數字"的方法

age=input('>>: ')

print(age.isdigit())

 

 

1.6 列表

#作用:多個裝備,多個愛好,多門課程,多個女朋友等

#定義:[]內可以有多個任意類型的值,逗號分隔

my_girl_friends=['alex','wupeiqi','yuanhao',4,5] #本質my_girl_friends=list([...])

 

l=list('abc')

 

 

#優先掌握的操作:

#1、按索引存取值(正向存取+反向存取):即可存也可以取     

#2、切片(顧頭不顧尾,步長)

#3、長度

#4、成員運算in和not in

#5、追加

#6、刪除

#7、迴圈

 

#ps:反向步長

l=[1,2,3,4,5,6]

 

 

#正向步長

l[0:3:1] #[1, 2, 3]

 

#反向步長

l[2::-1] #[3, 2, 1]

 

#列表翻轉

l[::-1] #[6, 5, 4, 3, 2, 1]

 

 

 

 

1.7 元組

#作用:存多個值,對比列表來說,元組不可變(是可以當做字典的key的),主要是用來讀

 

#定義:與列表類型比,只不過[]換成()

age=(11,22,33,44,55)本質age=tuple((11,22,33,44,55))

 

 

#優先掌握的操作:

#1、按索引取值(正向取+反向取):只能取  

#2、切片(顧頭不顧尾,步長)

#3、長度

#4、成員運算in和not in

#5、迴圈

 

#簡單購物車,要求如下:

實現列印商品詳細信息,用戶輸入商品名和購買個數,則將商品名,價格,購買個數加入購物列表,如果輸入為空或其他非法輸入則要求用戶重新輸入  

msg_dic={

'apple':10,

'tesla':100000,

'mac':3000,

'lenovo':30000,

'chicken':10,

}

 

 

msg_dic={

'apple':10,

'tesla':100000,

'mac':3000,

'lenovo':30000,

'chicken':10,

}

goods_l=[]

while True:

    for key,item in msg_dic.items():

        print('name:{name} price:{price}'.format(price=item,name=key))

    choice=input('商品>>: ').strip()

    if not choice or choice not in msg_dic:continue

    count=input('購買個數>>: ').strip()

    if not count.isdigit():continue

    goods_l.append((choice,msg_dic[choice],count))

 

    print(goods_l)

 

 

 

1.8 字典

#作用:存多個值,key-value存取,取值速度

#定義:key必須是不可變類型,value可以是任意類型

info={'name':'egon','age':18,'sex':'male'} #本質info=dict({....})

 

info=dict(name='egon',age=18,sex='male')

 

info=dict([['name','egon'],('age',18)])

 

{}.fromkeys(('name','age','sex'),None)

 

 

#優先掌握的操作:

#1、按key存取值:可存可取

#2、長度len

#3、成員運算in和not in

#4、刪除

#5、鍵keys(),值values(),鍵值對items()

#6、迴圈

1 有如下值集合 [11,22,33,44,55,66,77,88,99,90...],將所有大於 66 的值保存至字典的第一個key中,將小於 66 的值保存至第二個key的值中

 

即: {'k1': 大於66的所有值, 'k2': 小於66的所有值}

 

a={'k1':[],'k2':[]}

c=[11,22,33,44,55,66,77,88,99,90]

for i in c:

    if i>66:

        a['k1'].append(i)

    else:

        a['k2'].append(i)

print(a)

 

 

 

2 統計s='hello alex alex say hello sb sb'中每個單詞的個數

結果如:{'hello': 2, 'alex': 2, 'say': 1, 'sb': 2}

s='hello alex alex say hello sb sb'

 

l=s.split()

dic={}

for item in l:

    if item in dic:

        dic[item]+=1

    else:

        dic[item]=1

print(dic)

 

s='hello alex alex say hello sb sb'

dic={}

words=s.split()

print(words)

for word in words: #word='alex'

    dic[word]=s.count(word)

    print(dic)

 

 

 

 

#利用setdefault解決重覆賦值

'''

setdefault的功能

1:key存在,則不賦值,key不存在則設置預設值

2:key存在,返回的是key對應的已有的值,key不存在,返回的則是要設置的預設值

d={}

print(d.setdefault('a',1)) #返回1

 

 

d={'a':2222}

print(d.setdefault('a',1)) #返回2222

'''

s='hello alex alex say hello sb sb'

dic={}

words=s.split()

for word in words: #word='alex'

    dic.setdefault(word,s.count(word))

    print(dic)

 

 

#利用集合,去掉重覆,減少迴圈次數

s='hello alex alex say hello sb sb'

dic={}

words=s.split()

words_set=set(words)

for word in words_set:

    dic[word]=s.count(word)

    print(dic)

 

 

1.9 集合

#作用:去重,關係運算,

#定義:

            知識點回顧

            可變類型是不可hash類型

            不可變類型是可hash類型

#定義集合:

            集合:可以包含多個元素,用逗號分割,

            集合的元素遵循三個原則:

             1:每個元素必須是不可變類型(可hash,可作為字典的key)

             2:沒有重覆的元素

             3:無序

註意集合的目的是將不同的值存放到一起,不同的集合間用來做關係運算,無需糾結於集合中單個值

 

優先掌握的操作:

#1、長度len

#2、成員運算in和not in

 

#3、|合集

#4、&交集

#5、-差集

#6、^對稱差集

#7、==

#8、父集:>,>=

#9、子集:<,<=  

 

.關係運算

  有如下兩個集合,pythons是報名python課程的學員名字集合,linuxs是報名linux課程的學員名字集合

  pythons={'alex','egon','yuanhao','wupeiqi','gangdan','biubiu'}

  linuxs={'wupeiqi','oldboy','gangdan'}

  1. 求出即報名python又報名linux課程的學員名字集合

  2. 求出所有報名的學生名字集合

  3. 求出只報名python課程的學員名字

  4. 求出沒有同時這兩門課程的學員名字集合

# 有如下兩個集合,pythons是報名python課程的學員名字集合,linuxs是報名linux課程的學員名字集合

pythons={'alex','egon','yuanhao','wupeiqi','gangdan','biubiu'}

linuxs={'wupeiqi','oldboy','gangdan'}

 

# 求出即報名python又報名linux課程的學員名字集合

print(pythons & linuxs)

 

# 求出所有報名的學生名字集合

print(pythons | linuxs)

 

# 求出只報名python課程的學員名字

print(pythons - linuxs)

 

# 求出沒有同時這兩門課程的學員名字集合

print(pythons ^ linuxs)

 

 

去重

 

   1. 有列表l=['a','b',1,'a','a'],列表元素均為可hash類型,去重,得到新列表,且新列表無需保持列表原來的順序

   2.在上題的基礎上,保存列表原來的順序

   3.去除文件中重覆的行,肯定要保持文件內容的順序不變

   4.有如下列表,列表元素為不可hash類型,去重,得到新列表,且新列表一定要保持列表原來的順序

l=[

    {'name':'egon','age':18,'sex':'male'},

    {'name':'alex','age':73,'sex':'male'},

    {'name':'egon','age':20,'sex':'female'},

    {'name':'egon','age':18,'sex':'male'},

    {'name':'egon','age':18,'sex':'male'},

]  

#去重,無需保持原來的順序

l=['a','b',1,'a','a']

print(set(l))

 

 

#去重,並保持原來的順序

#方法一:不用集合

l=[1,'a','b',1,'a']

 

l1=[]

for i in l:

    if i not in l1:

        l1.append(i)

print(l1)

 

#方法二:藉助集合

l1=[]

s=set()

for i in l:

    if i not in s:

        s.add(i)

        l1.append(i)

 

print(l1)

 

 

#同上方法二,去除文件中重覆的行

import os

with open('db.txt','r',encoding='utf-8') as read_f,\

        open('.db.txt.swap','w',encoding='utf-8') as write_f:

    s=set()

    for line in read_f:

        if line not in s:

            s.add(line)

            write_f.write(line)

os.remove('db.txt')

os.rename('.db.txt.swap','db.txt')

 

 

#列表中元素為可變類型時,去重,並且保持原來順序

l=[

    {'name':'egon','age':18,'sex':'male'},

    {'name':'alex','age':73,'sex':'male'},

    {'name':'egon','age':20,'sex':'female'},

    {'name':'egon','age':18,'sex':'male'},

    {'name':'egon','age':18,'sex':'male'},

]

 

# print(set(l)) #報錯:unhashable type: 'dict'

s=set()

l1=[]

for item in l:

    val=(item['name'],item['age'],item['sex'])

    if val not in s:

        s.add(val)

        l1.append(item)

 

print(l1)

  

 

#定義函數,既可以針對可以hash類型又可以針對不可hash類型

def func(items,key=None):

    s=set()

    for item in items:

        val=item if key is None else key(item)

        if val not in s:

            s.add(val)

            yield item

 

print(list(func(l,key=lambda dic:(dic['name'],dic['age'],dic['sex']))))

 

 

1.10 數據類型總結

按存儲空間的占用分(從低到高)

 

數字

字元串

集合:無序,即無序存索引相關信息

元組:有序,需要存索引相關信息,不可變

列表:有序,需要存索引相關信息,可變,需要處理數據的增刪改

字典:無序,需要存key與value映射的相關信息,可變,需要處理數據的增刪改

按存值個數區分

 

標量/原子類型       數字,字元串

容器類型            列表,元組,字典

 

按可變不可變區分

可變        列表,字典

不可變    數字,字元串,元組

 

按訪問順序區分

直接訪問                  數字

順序訪問(序列類型)    字元串,列表,元組

key值訪問(映射類型)  字典

 

1.11 運算符

身份運算(is ,is not)

is比較的是id,而雙等號比較的是值

毫無疑問,id若相同則值肯定相同,而值相同id則不一定相同

>>> x=1234567890

>>> y=1234567890

>>> x == y

True

>>> id(x),id(y)

(3581040, 31550448)

>>> x is y

False

 

 

1.12 字元編碼

1.12.1 操作系統基礎

 

圖1-5  

 

1.12.2 文本編輯器存取文件的原理(nodepad++,pycharm,word)

#1、打開編輯器就打開了啟動了一個進程,是在記憶體中的,所以,用編輯器編寫的內容也都是存放與記憶體中的,斷電後數據丟失

#2、要想永久保存,需要點擊保存按鈕:編輯器把記憶體的數據刷到了硬碟上。

#3、在我們編寫一個py文件(沒有執行),跟編寫其他文件沒有任何區別,都只是在編寫一堆字元而已。

 

1.12.3 python解釋器執行py文件的原理 ,例如python test.py

#第一階段:python解釋器啟動,此時就相當於啟動了一個文本編輯器

#第二階段:python解釋器相當於文本編輯器,去打開test.py文件,從硬碟上將test.py的文件內容讀入到記憶體中(小複習:pyhon的解釋性,決定瞭解釋器只關心文件內容,不關心文件尾碼名)

#第三階段:python解釋器解釋執行剛剛載入到記憶體中test.py的代碼( ps:在該階段,即真正執行代碼時,才會識別python的語法,執行文件內代碼,當執行到name="egon"時,會開闢記憶體空間存放字元串"egon")

 

1.12.4 總結python解釋器與文件本編輯的異同

#1、相同點:python解釋器是解釋執行文件內容的,因而python解釋器具備讀py文件的功能,這一點與文本編輯器一樣

#2、不同點:文本編輯器將文件內容讀入記憶體後,是為了顯示或者編輯,根本不去理會python的語法,而python解釋器將文件內容讀入記憶體後,可不是為了給你瞅一眼python代碼寫的啥,而是為了執行python代碼、會識別python語法。

 

1.13 字元編碼介紹

1.13.1 什麼是字元編碼

複製代碼

  電腦要想工作必須通電,即用‘電’驅使電腦幹活,也就是說‘電’的特性決定了電腦的特性。電的特性即高低電平(人類從邏輯上將二進位數1對應高電平,二進位數0對應低電平),關於磁碟的磁特性也是同樣的道理。結論:電腦只認識數字

  很明顯,我們平時在使用電腦時,用的都是人類能讀懂的字元(用高級語言編程的結果也無非是在文件內寫了一堆字元),如何能讓電腦讀懂人類的字元?

  必須經過一個過程:

  #字元--------(翻譯過程)------->數字

  #這個過程實際就是一個字元如何對應一個特定數字的標準,這個標準稱之為字元編碼

以下兩個場景下涉及到字元編碼的問題:

#1、一個python文件中的內容是由一堆字元組成的,存取均涉及到字元編碼問題(python文件並未執行,前兩個階段均屬於該範疇)

#2、python中的數據類型字元串是由一串字元組成的(python文件執行時,即第三個階段)

1.13.2 字元編碼的發展史與分類

電腦由美國人發明,最早的字元編碼為ASCII,只規定了英文字母數字和一些特殊字元與數字的對應關係。最多只能用 8 位來表示(一個位元組),即:2**8 = 256,所以,ASCII碼最多只能表示 256 個符號

 

圖1-6  

當然我們編程語言都用英文沒問題,ASCII夠用,但是在處理數據時,不同的國家有不同的語言,日本人會在自己的程式中加入日文,中國人會加入中文。

而要表示中文,單拿一個位元組表表示一個漢子,是不可能表達完的(連小學生都認識兩千多個漢字),解決方法只有一個,就是一個位元組用>8位2進位代表,位數越多,代表的變化就多,這樣,就可以儘可能多的表達出不通的漢字,所以中國人規定了自己的標準gb2312編碼,規定了包含中文在內的字元->數字的對應關係。

日本人規定了自己的Shift_JIS編碼,南韓人規定了自己的Euc-kr編碼,所以迫切需要一個世界的標準(能包含全世界的語言)於是unicode應運而生。

ascii用1個位元組(8位二進位)代表一個字元

unicode常用2個位元組(16位二進位)代表一個字元,生僻字需要用4個位元組

這時候亂碼問題消失了,所有的文檔我們都使用但是新問題出現了,如果我們的文檔通篇都是英文,你用unicode會比ascii耗費多一倍的空間,在存儲和傳輸上十分的低效

本著節約的精神,又出現了把Unicode編碼轉化為“可變長編碼”的UTF-8編碼。UTF-8編碼把一個Unicode字元根據不同的數字大小編碼成1-6個位元組,常用的英文字母被編碼成1個位元組,漢字通常是3個位元組,只有很生僻的字元才會被編碼成4-6個位元組。如果你要傳輸的文本包含大量英文字元,用UTF-8編碼就能節省空間

1.13.3 總結字元編碼的發展可分為三個階段

階段一:現代電腦起源於美國,最早誕生也是基於英文考慮的ASCII

ASCII:一個Bytes代表一個字元(英文字元/鍵盤上的所有其他字元),1Bytes=8bit,8bit可以表示0-2**8-1種變化,即可以表示256個字元

ASCII最初只用了後七位,127個數字,已經完全能夠代表鍵盤上所有的字元了(英文字元/鍵盤的所有其他字元),後來為了將拉丁文也編碼進了ASCII表,將最高位也占用了

#階段二:為了滿足中文和英文,中國人定製了GBK

GBK:2Bytes代表一個中文字元,1Bytes表示一個英文字元

為了滿足其他國家,各個國家紛紛定製了自己的編碼

日本把日文編到Shift_JIS里,南韓把韓文編到Euc-kr里

 

#階段三:各國有各國的標準,就會不可避免地出現衝突,結果就是,在多語言混合的文本中,顯示出來會有亂碼。如何解決這個問題呢???

1、能夠相容萬國字元

#2、與全世界所有的字元編碼都有映射關係,這樣就可以轉換成任意國家的字元編碼

這就是unicode(定長), 統一用2Bytes代表一個字元, 雖然2**16-1=65535,但unicode卻可以存放100w+個字元,因為unicode存放了與其他編碼的映射關係,準確地說unicode並不是一種嚴格意義上的字元編碼表

nicode的詳情:

鏈接:https://pan.baidu.com/s/1dEV3RYp

很明顯對於通篇都是英文的文本來說,unicode的式無疑是多了一倍的存儲空間(二進位最終都是以電或者磁的方式存儲到存儲介質中的)

於是產生了UTF-8(可變長,全稱Unicode Transformation Format),對英文字元只用1Bytes表示,對中文字元用3Bytes,對其他生僻字用更多的Bytes去存

#總結:

記憶體中統一採用unicode,浪費空間來換取可以轉換成任意編碼(不亂碼),硬碟可以採用各種編碼,如utf-8,保證存放於硬碟或者基於網路傳輸的數據量很小,提高傳輸效率與穩定性。

1.13.4 總字元編碼應用之文件編輯器

#1、保證不亂嗎的核心法則就是,字元按照什麼標準而編碼的,就要按照什麼標準解碼,此處的標準指的就是字元編碼

#2、在記憶體中寫的所有字元,一視同仁,都是unicode編碼,比如我們打開編輯器,輸入一個“你”,我們並不能說“你”就是一個漢字,此時它僅僅只是一個符號,該符號可能很多國家都在使用,根據我們使用的輸入法不同這個字的樣式可能也不太一樣。只有在我們往硬碟保存或者基於網路傳輸時,才能確定”你“到底是一個漢字,還是一個日本字,這就是unicode轉換成其他編碼格式的過程了

                  unicode----->encode-------->utf-8

                  utf-8-------->decode---------->unicode

 

 

圖1-7  

 

1.13.5 字元編碼應用之python

執行python程式的三個階段

python test.py   (執行test.py的第一步,一定是先將文件內容讀入到記憶體中)

階段一:啟動python解釋器

階段二:python解釋器此時就是一個文本編輯器,負責打開文件test.py,即從硬碟中讀取test.py的內容到記憶體中

此時,python解釋器會讀取test.py的第一行內容,#coding:utf-8,來決定以什麼編碼格式來讀入記憶體,這一行就是來設定python解釋器這個軟體的編碼使用的編碼格式這個編碼,

可以用sys.getdefaultencoding()查看,如果不在python文件指定頭信息#-*-coding:utf-8-*-,那就使用預設的

python2中預設使用ascii,python3中預設使用utf-8

階段三:讀取已經載入到記憶體的代碼(unicode編碼格式),然後執行,執行過程中可能會開闢新的記憶體空間,比如x="egon"

記憶體的編碼使用unicode,不代表記憶體中全都是unicode,

在程式執行之前,記憶體中確實都是unicode,比如從文件中讀取了一行x="egon",其中的x,等號,引號,地位都一樣,都是普通字元而已,都是以unicode的格式存放於記憶體中的,但是程式在執行過程中,會申請記憶體(與程式代碼所存在的記憶體是倆個空間)用來存放python的數據類型的值,而python的字元串類型又涉及到了字元的概念

比如x="egon",會被python解釋器識別為字元串,會申請記憶體空間來存放字元串類型的值,至於該字元串類型的值被識別成何種編碼存放,這就與python解釋器的有關了,而python2與python3的字元串類型又有所不同。

1.14 python2與python3字元串類型的區別

在python2中有兩種字元串類型str和unicode

str類型

當python解釋器執行到產生字元串的代碼時(例如x='上'),會申請新的記憶體地址,然後將'上'編碼成文件開頭指定的編碼格式

要想看x在記憶體中的真實格式,可以將其放入列表中再列印,而不要直接列印,因為直接print()會自動轉換編碼,這一點我們稍後再說。

#coding:gbk

x=''

y=''

print([x,y]) #['\xc9\xcf', '\xcf\xc2']

 

#\x代表16進位,此處是c9cf總共4位16進位數,一個16進位四4個比特位,4個16進位數則是16個比特位,即2個Bytes,這就證明瞭按照gbk編碼中文用2Bytes

print(type(x),type(y)) #(<type 'str'>, <type 'str'>)

 

 

記憶體中的數據通常用16進位表示,2位16進位數據代表一個位元組,如\xc9,代表兩位16進位,一個位元組

gbk存中文需要2個bytes,而存英文則需要1個bytes,它是如何做到的???!!!

gbk會在每個bytes,即8位bit的第一個位作為標誌位,標誌位為1則表示是中文字元,如果標誌位為0則表示為英文字元

x=‘你a好’

轉成gbk格式二進位位

8bit+8bit+8bit+8bit+8bit=(1+7bit)+(1+7bit)+(0+7bit)+(1+7bit)+(1+7bit)

這樣電腦按照從左往右的順序讀:

#連續讀到前兩個括弧內的首位標誌位均為1,則構成一個中午字元:你

#讀到第三個括弧的首位標誌為0,則該8bit代表一個英文字元:a

#連續讀到後兩個括弧內的首位標誌位均為1,則構成一個中午字元:好

也就是說,每個Bytes留給我們用來存真正值的有效位數只有7位,而在unicode表中存放的只是這有效的7位,至於首位的標誌位與具體的編碼有關,即在unicode中表示gbk的方式為:

 

(7bit)+(7bit)+(7bit)+(7bit)+(7bit)

 

 

 

圖1-8  

按照上圖翻譯的結果,我們可以去unicode關於漢字的對應關係中去查:鏈接:https://pan.baidu.com/s/1dEV3RYp

# f=open(r'C:\Users\Administrator\PycharmProjects\python20期\day2\a.txt')

 

# f=open('a.txt','r',encoding='utf-8')

# data=f.read()

# print(data)

# print(f)

# f.close() #文件關閉,回收操作系統的資源

# print(f)

# f.read()

 

# with open('a.txt','r',encoding='utf-8') as f: #f=open('a.txt','r',encoding='utf-8')

#     pass

 

 

 

1.15 文件處理

1.15.1 讀操作:r只讀模式,預設是rt文本讀

# f=open('a.txt','r',encoding='utf-8')

# # data1=f.read()

# # print('=1===>',data1)

# # data2=f.read()

# # print('=2===>',data2)

#

# # print(f.readlines())

#

# # print(f.readline(),end='')

# # print(f.readline(),end='')

# # print(f.readline(),end='')

#

#

# f.close()

 

 

1.15.2 寫操作:w只寫模式,預設是wt文本寫,如果文件不存在則創建,存在則清空+覆蓋

f=open('a.txt','w',encoding='utf-8')

# f.write('11111\n')

# f.write('222222\n')

# f.write('1111\n2222\n3333\n')

# f.writelines(['哈哈哈哈\n','你好','alex'])

f.close()

 

 

 

圖1-9  

可以看到“”上“”對應的gbk(G0代表的是gbk)編碼就為494F,即我們得出的結果,而上對應的unicode編碼為4E0A,我們可以將gbk-->decode-->unicode

#coding:gbk

x=''.decode('gbk')

y=''.decode('gbk')

print([x,y]) #[u'\u4e0a', u'\u4e0b'] 

unicode類型

當python解釋器執行到產生字元串的代碼時(例如s=u'林'),會申請新的記憶體地址,然後將'林'以unicode的格式存放到新的記憶體空間中,所以s只能encode,不能decode

#coding:gbk

x=u'' #等同於 x='上'.decode('gbk')

y=u'' #等同於 y='下'.decode('gbk')

print([x,y]) #[u'\u4e0a', u'\u4e0b']

print(type(x),type(y)) #(<type 'unicode'>, <type 'unicode'>)

 

 

unicode這麼好,不會亂碼,那python2為何還那麼彆扭,搞一個str出來呢?python誕生之時,unicode並未像今天這樣普及,很明顯,好的東西你能看得見,龜叔早就看見了,龜叔在python3中將str直接存成unicode,我們定義一個str,無需加u首碼,就是一個unicode

在python3 中也有兩種字元串類型str和bytes

str是unicode

#coding:gbk

x='' #當程式執行時,無需加u,'上'也會被以unicode形式保存新的記憶體空間中,

print(type(x)) #<class 'str'>

#x可以直接encode成任意編碼格式

print(x.encode('gbk')) #

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 所謂圖片爬蟲,就是從互聯網中自動把對方伺服器上的圖片爬下來的爬蟲程式。有些圖片是直接在html文件裡面,有些是隱藏在JS文件中,在html文件中只需要我們分析源碼就能得到如果是隱藏在JS文件中,那麼就需要進行抓包分析,這兒先只講分析html源碼得出圖片,註意 這兒我們需要讀取的是高清原圖,不是經過網... ...
  • '''python中有五種數據類型,分別是整數、浮點數、字元串、布爾值、空值'''a = 1b = 2.0c = 'hello,world'print (a,b,c)#a是整數,b是浮點數,c是字元串float(a);print(a)int(b);print(b)str(a);print(a)#以上 ...
  • 轉義字元 通過\來轉變後面字母或者符號的含義\n:換行\b:退格 相當於backspace\r:按下回車鍵 window系統 回車符是由兩個字元來表示\r\n\t:製表符 相當於tab鍵 邏輯運算符 %左邊等於右邊就是0右邊是1結果是0如果出現負數 只看左邊是否負數& 只要兩邊的boolean表達式 ...
  • https://www.cnblogs.com/ggzss/archive/2011/08/18/2145017.html assert是一個巨集定義,其作用是如果它的條件返回錯誤,則終止程式執行,原型定義: assert的作用是現計算表達式 expression ,如果其值為假(即為0),那麼它先向 ...
  • 這裡儘管缺少消息發送所需要的點(.)以及該消息的顯示接收者,卻依然發送了消息puts並傳遞了參數“Hello”給一個對象:預設對象self。在程式運行期間,雖然作為self的對象通過特定規則發生改變,但self總是被預定義好的。 ...
  • UDP 用戶數據報協議,是一個簡單的面向數據報的運輸層協議。UDP不提供可靠性,它只是把應用程式傳給IP層的數據報發送出去,但是並不能保證它們能到達目的地 ,也不能保證數據包到達的順序。由於UDP在傳輸數據報前不用在客戶和伺服器之間建立一個連接,且沒有超時重發等機制,故而傳輸速度很快。 在Java中 ...
  • 如果字元串的行尾沒有包含換行符,puts就會添加一個,但print不會; print會精確列印內容並讓游標留在末尾(在某些系統平臺,在程式輸出的末尾會自動換行); p會輸出一個審查字元串,它通常會包含一些額外的輸出信息。 ...
  • 希望大家指點有哪些地方不足! Html 代碼 觸發上傳 js 代碼 後臺使用了spring mvc 上傳完成後的文件是這樣的。 合併文件 轉成集合排序會方便點,但是在別人的電腦上測試會有問題 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...