1. 程式人生 > >Python學習筆記二

Python學習筆記二

計算機系統 也不能 定位 通用 語句 長度 處理中文 進制 trac

參考教程:廖雪峰官網https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000

一、輸入和輸出

通過“print()"函數可以向屏幕輸出指定文字:

print("Hello World!")

這裏通過雙引號加入要輸出的字符串,也可以通過單引號。該函數也接受多個字符串,之間用逗號”,"分隔,要註意的是這裏解釋器遇到分隔符逗號時會自動輸出一個空格:

print("Hello","World","!")

通過input()函數可以讓用戶輸入字符串:

name=input()

當上行代碼運行後,系統就等待用戶的輸入了,輸入完成後按回車鍵結束輸入。輸入的內容被存儲到name這個變量中了。

一次完整、友好的輸入輸出程序如下:

print("Please enter your name:")
name = input()
print("Hello,",name)

上述的提示信息也可以直接用input()實現,input()的參數會先被系統打印出來,然後再等待用戶輸入:

name = input("Please enter your name: ")
print("Hello,",name)

二、Python基礎

*Python程序是大小寫敏感的;

*以“#"開頭的語句是註釋;

*作為良好的編程習慣,縮進建議使用4個空格符;

(一)數據類型

Python中的數據類型包括:整數、浮點數、字符串、布爾值、空值。

*字符串:通過單引號或雙引號括起來的任意文本即是字符串,如"abc"、"k"、”123“等。某些情況下需要通過轉義字符\來標識,對於字符串I‘m "OK"!,在Python中需要如下表示:‘I\‘m \"OK\"‘。

轉義字符中\n表示換行,\t表示制表符,\\表示字符‘\‘本身。有一種情況Python可以通過r‘‘(字母r+兩個單引號)表示其內部的字符串默認不進行轉義:

print(\\\t\\)
#輸出\         \
print(r\\\t\\)
#輸出\\\t\\

*空值在Python中用None表示,並不能理解為0。

*變量:對於變量的數據類型不固定的程序語言稱為動態語言,與之對應的是靜態語言。Python即是一種動態語言,所以在實際使用中,並不需要聲明這個過程就可以直接使用,在賦值後也可以再次賦予不同類型的值:

k=10
k="you"
k=True

對於下列代碼的理解:

a="ABC"
#1、內存中創建一個“ABC”的字符串
#2、內存中創建一個名為a的變量,並把他指向上述“ABC"
b=a
#把a的指向賦值給b,即指向上述”ABC"
a="XYZ"
#1、內存中創建一個“XYZ”的字符串
#2、把a指向上述“XYZ"
print(b)
#輸出"ABC",因為b的指向仍然為”ABC“

(二)字符編碼

因為計算機是美國人發明的,所以最早只有127個字符(26個大小寫字母加一些符號)被編碼到計算機裏,這個對應的編碼表被稱為ASCII編碼,比如A對應的ASCII碼是65(2進制為0100 0001),“z”對應編碼為122(2進制為0111 1010);ASCII碼長度為一字節,無法處理中文等其他符號,Unicode把所有語言都統一到一套編碼中,通常用兩個字節表示一個字符(除非特別生僻的會用到4個字節),字母A對應的Unicode編碼為00000000 01000001;比ASCII碼多出一倍的存儲空間,因此又出現了可變長的UTF-8編碼。UTF-8編碼把Unicode字符根據不同的大小編碼成1-6個字節,英文字母為1字節,中文漢字字符通常為3字節,很生僻的字符4-6字節,這樣如果要處理的字符包含大量英文字母,那使用UTF-8編碼就可以方便存儲和傳輸。

目前計算機系統通用的字符編碼工作方式:在計算機內存中統一使用Unicode編碼,當需要保存到硬盤或者需要傳輸時就使用UTF-8。比如用記事本編輯的時候,從文件讀取的UTF-8字符被轉換為Unicode字符到內存中,編輯完成後再轉換成UTF-8進行保存到文件裏。

在最新的Python3中,字符串是以Unicode進行編碼的,對於單個字符的編碼,Python提供了ord()函數獲取其整數編碼值,chr()函數則反向把編碼值轉換成字符。

由於Python中字符串類型是str,在內存中用Unicode表示,一個字符對應若幹字節,如果要在網絡上傳輸或者保存到硬盤裏,就需要把str變為以字節為單位的bytes:

x=bABC

需要區分‘ABC‘和b‘ABC‘,前者是字符串,後者雖然內容和前者一樣,但是bytes的每個字符只占用一個字節,字符串可以通過encode()函數編碼為指定的bytes:

>>>ABC.encode(ascii)
bABC
>>>中文.encode(utf-8)
b\xe4\xb8\xad\xe6\x96\x87‘
>>>中文.encode(ascii)
TraceBack(most recent call last):
....

反過來,如果在硬盤或網絡上讀取了字節流,即數據為bytes,需要把bytes變為str,要用到decode()方法:

>>>b\xe4\xb8\xad\xe6\x96\x87.decode(utf-8)
中文
>>>bABC.decode(ascii)
ABC

要計算str中包含多少個字符,可以使用len()函數,如果換成bytes,len()函數就計算字節數:

>>> len(ABC)
3
>>> len(中文)
2
>>> len(bABC)
3
>>> len(b\xe4\xb8\xad\xe6\x96\x87)
6
>>> len(中文.encode(utf-8))
6

在操作字符串時,經常遇到str和bytes的互相轉換,為了避免亂碼,應堅持utf-8編碼對str和bytes進行轉換,由於Python源代碼也是一個文本文件,所以,當你的源代碼中包含中文的時候,在保存源代碼時,就需要務必指定保存為UTF-8編碼。當Python解釋器讀取源代碼時,為了讓它按UTF-8編碼讀取,我們通常在文件開頭寫上這兩行:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

第一行註釋是為了告訴Linux/OS X系統,這是一個Python可執行程序,Windows系統會忽略這個註釋;

第二行註釋是為了告訴Python解釋器,按照UTF-8編碼讀取源代碼,否則,你在源代碼中寫的中文輸出可能會有亂碼。

三、list、tuple、dict和set

(一)list

list是一種有序的集合,可以添加和刪除元素。

classmates=[Michael,Bob,Tracy]
#輸出列表長度3
len(classmates)   
#各個元素的訪問
classmates[0]
classmates[1]
classmates[2]
classmates[-1]
classmates[-2]
classmates[-3]
#在列表尾部添加元素
classmates.append[Adam]
#指定位置插入元素
#插入後列表為:‘Michael‘ ‘Bob‘ ‘Jenny‘  ‘Tracy‘ ‘Adam‘
classmates.insert(2,Jenny)
#刪除列表尾部元素並返回
classmates.pop()
#刪除指定位置的元素並返回
#刪除後列表為:‘Michael‘ ‘Jenny‘  ‘Tracy‘ ‘Adam‘
classmates.pop(1)
#列表內的元素的數據類型可以不相同
Lista=[123,88,abc,True,[1,2,12]]
#返回‘12‘
Lista[4][2]

(二)tuple

tuple是另外一種有序的列表,但其一旦初始化就不能進行修改,也沒有insert、append這些方法,所以代碼更安全。

#定義一個tuple
t=(1,2)
#定義一個空元素的tuple
t1=()
#定義一個元素的tuple,元素後必須加一個逗號
t2=(1,)

對於如下代碼:

t=(a,b,[A,B])
t[2][0]=X
t[2][1]=Y

可以發現t改變了,如何在這裏理解tuple元組的不可變呢?元組t在定義時候有三個元素,為兩個字符串和一個列表;要註意這裏第三個元素的指向始終是這個列表,只是這個列表最開始是指向了存儲‘A‘和‘B‘的內存,隨後又指向了新創建的兩個字符串‘X‘和‘Y‘的內存。元組中第三個元素的指向並沒有變,變的是其指向的列表的指向。

(三)dict

Python內置的數據類型字典dict使用鍵:值的方式存儲,具有極快的查詢速度。

d={Michael:95,Bob:75,Tracy:85}
#只需要知道鍵就可以直接查詢到值
print(d[Tracy])

與列表不同,列表是有序的,查詢列表需要從下標0開始逐個查找,直到查找到為止。字典是先直接計算出鍵對應的位置,然後直接取出其值,所以對於這種key:value的存儲方式,在添加元素的時候,必須根據key算出value的存儲位置,這種算法稱為哈希算法。要保證哈希算法的正確性,作為key的對象就不能變,因此key 必須是不可變類型,即整數、字符串、浮點數、元組。也因此字典中一個鍵只能對應一個value。

d={Michael:95,Bob:75,Tracy:85}
#直接添加新元素
d[Jenny]=90
#多次添加同一鍵的值,後面會覆蓋前面的值
d[Jenny]=96
#如果訪問一個不存在的鍵會報錯
print (d[Tom])
#可以用in先進行判斷
str=input(please enter the name:)
if str in d:
    print (d[str])
#通過get()方法返回其值,如果參數鍵不存在返回None
#也可以在get(‘key‘,?)中第二個參數自定義如鍵不存在則返回的值
print (d.get(Tom,查詢的鍵不存在))
#pop(key)方法可以刪除一個鍵及其值
x=pop(Bob)

(四)set

set類似於dict,是一組key的集合,所以set的元素必須也為不可變類型,但其不存儲值,因為key不能重復,所以set中也不能有重復的元素。

#set的創建需要通過set()方法,並提供一個列表作為輸入集
#創建後s={1,2,3},重復元素會被過濾掉
s=set([1,2,2,3,1])
#通過add()方法添加元素
s.add(4)
s.add(2)
#s={1,2,3,4}
#通過remove()方法刪除元素
s.remove(4)
#s={1,2,3}
#兩個set可以做數學意義上的交集合集等操作
s0={[1,3,5]}
sn1=s&s0
#sn1={1,3}
sn2=s|s0
#sn2={1,2,3,5}

四、循環

Python中的循環有兩種方式:

(一)for/in循環

依次把需要循環的每個元素叠代出來:

names=[Michael,Bob,Tracy]
for name in names:
    print (name)

如果要計算1到10之間的整數和:

t=(1,2,3,4,5,6,7,8,9,10)
sum=0
for x in t:
    sum+=x
print (sum)

那麽如果要計算更大區間的整數之和,比如1到100的,就可以用到range()函數,先生成一個整數序列,再通過list()函數將其轉換成list。如range(5)生成的序列從0到小於5的整數:0,1,2,3,4。

list(range(5))
#生成[0,1,2,3,4]
sum=0
for x in range(101):
    sum+=x
print(sum)

(二)while循環

只要條件滿足,就不斷循環,直到條件不滿足時退出。

#計算100以內奇數之和
sum=0
i=0
while (2*i+1<=100):
    sum+=2*i+1
    i++
print(sum)

(三)break

break語句一般用於循環中的提前退出:

n=1
while n<100:
    if n>10:
        break
    print(n)
    n=n+1
print(end)

(四)continue

用於循環過程中跳出當前次的循環,直接進入下一次循環:

#continue計算100以內奇數之和
sum=0
i=0
while i<=100:
    if i%2==0:
        i++
        continue
i++
sum+=i print(sum)

Python學習筆記二