1. 程式人生 > >【Python】程式設計筆記2

【Python】程式設計筆記2

一、字串和編碼

1、字元編碼

過程:ASCII ==》Unicode ==》utf-8

  • ASCII編碼:一個位元組,127個字元;
  • Unicode將所有語言都統一到一套編碼中,解決了亂碼的問題。Unicode最常用的用 2 個位元組表示一個字元(若要用到非常偏僻的字元,就需要4個位元組);
  • UTF-8 解決了Unicode編碼空間浪費問題,將Unicode轉換為”可變長編碼“。具體來說,UTF-8 編碼把一個 Unicode 字元根據不同的數字大小編碼成 1-6 個位元組,常用的英文字母被編碼成 1 個位元組,漢字通常是 3 個位元組,只有很生僻的字元才會被編碼成 4-6 個位元組。

在計算機記憶體中,統一使用 Unicode 編碼,當需要儲存到硬碟或者需要傳輸的時候,就轉換為 UTF-8 編碼。

2、字串

Python3中字元產是以 Unicode 編碼的。
==》支援多語言

print('包含中文的 str')

輸出結果

包含中文的 str

(1)ord() 與 chr()

對於單個字元的編碼,有:

  • ord()函式:獲取字元的整數表示;
  • chr()函式:把編碼轉換為對應的字元;
print(ord('A'))
print(ord('中'))
print(chr(66))
print(chr(25991
))

輸出結果

65
20013
B
文

(2)str型別 ==》bytes型別

bytes型別的資料用帶 b字首 的單引號或雙引號表示:

# 區分'ABC'和 b'ABC',前者是 str,
# 後者雖然內容顯示得和前者一樣,
# 但 bytes 的每個字元都只佔用一個位元組。
x = b'ABC'

(3)encode()

以 Unicode 表示的 str 通過 encode()方法可以編碼為指定的 bytes。

  • 純英文 str 可用ASCII編碼為bytes;
  • 含有中文的 str 可用 UTF-8 編碼為bytes;
  • 含有中文的 str 不能用ASCII編碼,因為中文編碼超出了ASCII編碼的範圍==》報錯
print('ABC'.encode('ascii'))
print('中文'.encode('utf-8'))
print('中文'.encode('ascii'))

輸出結果

b'ABC'
b'\xe4\xb8\xad\xe6\x96\x87'
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)

(4)decode()

bytes ==》str

print(b'ABC'.decode('ascii'))
print(b'\xe4\xb8\xad\xe6\x96\x87'.decode('utf-8'))

輸出結果:

ABC
中文
  • len()函式:計算str包含的字元數
print(len('ABC'))
print(len('中文'))
## str型別
print(len(b'ABC'))
print(len(b'\xe4\xb8\xad\xe6\x96\x87'))
print(len('中文'.encode('utf-8')))

輸出結果:

3
2
3
6
6

==》1 箇中文字元經過 UTF-8 編碼後通常會佔用 3 個位元組,而 1 個英文字元只佔用 1 個位元組。

==》為了避免亂碼問題,應當始終堅持使用 UTF-8 編碼對 str 和 bytes 進行轉換。

3、utf-8編碼讀取

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

解讀:

  1. 第一行註釋是為了告訴 Linux/OS X 系統,這是一個 Python 可執行程式,Windows 系統會忽略這個註釋;
  2. 告訴 Python 直譯器,按照 UTF-8 編碼讀取原始碼,否則,你在原始碼中寫的中文輸出可能會有亂碼。

二、格式化

print('Hello, %s' % 'world')
print('Hi, %s, you have $%d.' % ('Michael', 1000000))

輸出結果

Hello, world
Hi, Michael, you have $1000000.

如果只有一個 %? ,括號可以省略。

1、常用的佔位符

佔位符 含義
%d 整數
%f 浮點數
%s 字串
%x 十六進位制整數

2、格式控制

  • 格式化整數和浮點數還可以指定是否補 0 和整數與小數的位數:
print('%2d-%02d' % (3, 1))
print('%.2f' % 3.1415926)

輸出結果

 3-01
3.15

若不確定用什麼==》使用%s,轉化為字串

三、list 和 tuple

1、list 列表

list 是一種有序的集合,可以隨時新增和刪除其中的元素。

classmates = ['Michael','Bob','Tracy']
print(classmates)

## len() 函式獲取list
print(len(classmates))

## 用索引進行元素的訪問
print(classmates[0])
print(classmates[1])
print(classmates[2])
# # 當索引超出了範圍時, Python 會報一個 IndexError 錯誤
# print(classmates[3])
print(classmates[-1])  # 取最後一個元素
print(classmates[-2])  # 取倒數第 2 個

## 新增元素
classmates.append('Adam')      # 新增元素到末尾
print(classmates)
classmates.insert(1, 'Jack')   # 在指定位置插入元素,eg:索引號為 1 的位置
print(classmates)

## 刪除元素
classmates.pop()  # 刪除末尾元素
print(classmates)
# 刪除指定位置的元素,pop(i),i為索引位置
classmates.pop(1)
print(classmates)

## 元素替換
classmates[1] = 'Sarah'
print(classmates)

## list中元素的資料型別可以不同,可以巢狀
L = ['Apple', 123, True]
s = ['python', 'java', ['asp', 'php'], 'scheme']
print(len(s))

輸出結果

['Michael', 'Bob', 'Tracy']
3
Michael
Bob
Tracy
Tracy
Bob
['Michael', 'Bob', 'Tracy', 'Adam']
['Michael', 'Jack', 'Bob', 'Tracy', 'Adam']
['Michael', 'Jack', 'Bob', 'Tracy']
['Michael', 'Bob', 'Tracy']
['Michael', 'Sarah', 'Tracy']
4

2、tuple

tuple 一旦初始化就不能修改。
也就是,tuple 的每個元素,指向永遠不變。

classmates = ('Micjael', 'Bob', 'Tracy')
## 因為初始化之後不能修改,所以沒有append()、insert()這樣的方法。
## 可以訪問
print(classmates[0])
print(classmates[-1])

## 空的 tuple
t = ()
print(t)

## 定義只有 1 個元素的 tuple
# Python 規定:按小括號進行計算,計算結果自然是 1。
t = (1,)
print(t)

## “可變的”tuple
t = ('a', 'b', ['A', 'B'])
t[2][0] = 'X'
t[2][1] = 'Y'
print(t)

輸出結果

Micjael
Tracy
()
(1,)
('a', 'b', ['X', 'Y'])

四、條件判斷

1、條件判斷—— if 語句

注意

  • 不要少寫冒號;
  • elif 是else if 的縮寫;
if <條件判斷1>:
	<執行1>
elif <條件判斷2>:
	<執行2>
elif <條件判斷3>:
	<執行3>
else:
	<執行4>

示例1

age  = 20
if age <= 6:
    print('kid')
elif age <= 18:
    print('teenager')
else:
    print('adult')

輸出結果

adult

示例2

if x:
    print('True')
else:
    print('Fasle')

分析:只要 x 是非零數值、非空字串、非空 list 等,就判斷為 True,否則為 False。

注意:input() 函式

birth = input('birth:')
if birth < 2000:
    print('00前')
else:
    print('00後')

報錯

TypeError: '<' not supported between instances of 'str' and 'int'

input()返回的資料型別是 str, str 不能直接和整數比較,必須先把 str 轉換成整數。

修改版本:str型別轉換為int型別

birth = input('birth:')
if int(birth) < 2000:
    print('00前')
else:
    print('00後')

2、迴圈

(1)for … in 迴圈

依次把 list 或 tuple 中的每個元素迭代出來。

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

輸出結果

Michael
Bob
Tracy

常用:range() 函式

sum = 0
# range(101):生成 0-100 的整數序列
for x in range(101):
    sum = sum + x
print(sum)

輸出結果

5050

(2)while 迴圈

只要條件滿足,就不斷迴圈,條件不滿足時退出迴圈。

sum = 0
n = 99
while n > 0:
    sum = sum + n
    n = n - 2
print(sum)

==》2500