Python是一門弱類型語言,弱類型包含兩方面的含義:①所有的變量無須聲明即可使用;②變量的數據類型可以隨時改變。
一、註釋
註釋的作用是用來解釋程序某些部分的作用和功能,提高程序的可讀性。
Python源代碼的註釋有兩種形式:
● 單行註釋:使用(#)表示單行註釋的開始,#號後面直到這行結束爲止的代碼都將被解釋器忽略
● 多行註釋:使用三個單引號或三個雙引號將註釋內容括起來。
註釋本身對程序並沒有任何影響,主要作用是給“別人看”,Python解釋器會忽略這些註釋內容。
二、變量
變量就像一個個小容器,用於“盛裝”程序中的數據。
常量與變量的區別:常量一旦保存某個數據之後,該數據就不能發生改變;變量保存的數據可以多次發生改變,主要程序對變量重新賦值。
(=)賦值運算符,將值賦給變量。
查看變量類型可以使用type()函數
# 定義一個數值類型變量
a = 5
print(a)
# 重新將字符串賦值給a變量
a = 'Hello, Joe'
print(a)
print(type(a))
運行結果
5
Hello, Joe
<class 'str'>
print()函數詳細語法格式:
print(value, ..., sep=' ', end='\n', file=sys.stdout, flush=False)
value參數可以接受任意多個變量或值
user_name = 'Joe'
user_age = 40
# 同時輸出多個變量和字符串
print("用戶名:", user_name, "年齡:", user_age)
輸出結果:
用戶名: Joe 年齡: 40
默認情況下,Python使用空格隔開多個變量,如果希望改變默認的分隔符,可以通過指定sep參數進行設置。
print("用戶名:", user_name, "年齡:", user_age, sep="|")
輸出結果:
用戶名:|Joe|年齡:|40
默認情況下,print()函數的end參數默認值爲'\n'因此,print()函數輸出之後總會換行,要改變這兒默認行爲,可以重設end參數,如:
print(40, '\t', end="")
print(50, '\t', end="")
print(60, '\t', end="")
輸出結果:
40 50 60
print()函數的file參數默認值sys.stdout,代表了希望標準輸出,一般情況下是屏幕,也可以更改該值讓程序將結果輸出到文件。如:
f = open("poem.txt", "w") # 打開文件以便寫入
print('兩情若是久長時', file=f)
print('又豈在朝朝暮暮', file=f)
f.close()
print()函數的flush參數用於控制輸出緩存,該參數一般保持False即可,這樣可以獲得較好的性能。
Python語言的標識符必須以字母、下劃線(_)開頭,後面可以跟任意數目的字母、數字、和下劃線(_)。此處的字母並不侷限於26個英文字母,可以包含中文字符、日文字符等。
Python2.x對中文支持較差,如果要在Python2.x程序中使用中文字符或中文變量,則需要在python源程序的第一行增加"# coding:utf-8",然後將源文件保存爲UTF-8字符集。
Python語言區分大小寫,因此abc和Abc是兩個不同的標識符。
標識符規則:
● 標識符可以由字母、數字、下劃線(_)組成,其中數字不能打頭。
● 標識符不能是Python關鍵字,但可以包含關鍵字。
● 標識符不能包含空格。
表2.1 Python關鍵字
False | None | True | and | as |
assert | break | class | continue | def |
del | elif | else | except | finally |
for | from | global | if | import |
in | is | lambda | nonlocal | not |
or | pass | raise | return | try |
while | with | yield |
實際上並不需要記憶關鍵字列表,開發時可以隨時通過程序來查看Python所包含的關鍵字,如下所示:
# 導入keyword模塊
import keyword
# 顯示所有關鍵字
print(keyword.kwlist)
輸出結果:
['False', 'None', 'True', 'and', 'as', 'assert', 'async', 'await', 'break', 'class', 'continue', 'def', 'del', 'elif', 'else', 'except', 'finally', 'for', 'from', 'global', 'if', 'import', 'in', 'is', 'lambda', 'nonlocal', 'not', 'or', 'pass', 'raise', 'return', 'try', 'while', 'with', 'yield']
表2.2 Python內置函數
abs() | all() | any() | basestring() | bin() |
bool() | bytearray() | callable() | chr() | classmethod() |
cmp() | compile() | complex() | delattr() | dict() |
dir() | divmod() | enumerate() | eval() | execfile() |
file() | filter() | float() | format() | frozenset() |
getattr() | globals() | hasattr() | hash() | help() |
hex() | id() | input() | int() | isinstance() |
issubclass() | iter() | len() | list() | locals() |
long() | map() | max() | memoryview() | min() |
next() | object() | oct() | open() | ord() |
pow() | print() | property() | range() | raw_input() |
reduce() | reload() | repr() | reversed() | zip() |
round() | set() | setattr() | slice() | sorted() |
staticmethod() | str() | sum() | super() | tuple() |
type() | unichr() | unicode() | vars() | xrange() |
Zip() | __import__() | apply() | buffer() | coerce() |
intern |
以上內置函數的名字也不應該作爲標識符,否則python的內置函數會被覆蓋。
三、數值類型
1.整型
Python的整型支持None值(空值)
Python的整型數值有4種表示形式。
● 十進制形式:最普通的整數就是十進制形式的整數。
● 二進制形式:以0b或者0B開頭的整數就是二進制形式的整數。
● 八進制形式:以0o或者0O開頭的整數就是八進制形式的整數
● 十六進制形式:以0x或者0X開頭的整數就是十六進制形式的整數,其中10~15分別以a~f來表示
爲了提高數值(包括浮點型)的可讀性,Python3.x允許爲數值(包括浮點型)增加下劃線作爲分隔符。這些下劃線不會影響數值本身。
# 在數值中使用下劃線
one_million = 1_000_000
print(one_million)
prince = 234_234_234 # price實際的值爲234234234
android = 1234_1234 # android實際的值爲12341234
2. 浮點型
Python浮點數有兩種表示形式:
● 十進制形式:這種形式就是平常簡單的浮點數,例如:5.12、512.0、0.512 。浮點數必須包含一個小數點,否則會被當成整數處理。
● 科學計數形式:如:5.12e2(5.12 × 102)、5.12E2
3. 複數
Python可以支持複數,複數的虛部用j或J來表示。
Python的cmath模塊支持複數運算。
四、 字符串入門
字符串的意思就是“一串字符”
字符串既可以用單引號括起來,也可以用雙引號括起來。
Python允許使用反斜線(\)將字符串中的特殊字符進行轉義。
將數值轉換成字符串,可以使用str()或repr()函數。
input()函數用於向用戶生成一條提示,然後獲取用戶輸入的內容,而input()函數總是返回一個字符串。
Python2中使用raw_input()函數實現同樣的功能。
Python不是格式自由的語言,因此Python程序的換行、縮進都有其規定的語法。
原始字符串以“r”開頭,原始字符串不會把反斜線當成特殊字符。
如果原始字符串包含引號,程序同樣需要對引號進行轉義(否則Python同樣無法對字符串的引號精確配對),但此時用於轉義的反斜線會變成字符串的一部分。如:
>>> # 原始字符串包含的引號,同樣需要轉義
>>> s2 = r'"Let\'s go", said Charlie'
>>> print(s2)
"Let\'s go", said Charlie
Python3新增了tytes類型,用於代表字節串。字符串(str)由多哦字符組成,以字符爲單位進行操作;字節串(bytes)由多個字節組成,以字節爲單位進行操作。
bytes對象只負責以字節(二進制格式)序列來記錄數據。採用合適的字符集,字符串可以轉換爲字節串,字節串也可以恢復成對應的字符串。
由於bytes保存的就是原始的字節(二進制格式)數據,因此byes對象可用於在網絡上傳輸數據,也可用於存儲各種二進制格式的文件,比如圖片、音樂等文件。
將一個字符串轉換成bytes對象,有三種方式:
● 如果字符串內容都是ASCII字符,則可以通過直接在字符串之前添加b來構建字節串值。
● 調用bytes()函數(其實是bytes的構造方法)將字符串按指定字符集轉成字節串,默認使用UTF-8字符集。
● 調用字符串本身的encode()方法將字符串按指定字符集轉換成字節串,默認使用UTF-8字符集。
計算機底層有兩個基本概念:位(bit)和字節(byte),其中bit代表1位,要麼是0,要麼是1,byte代表1字節,1字節包含8位。
在字節串中每個數據單元都是字節,也就是8位,其中每4位(相當於4位二進制數,最小值爲0,最大值爲15)可以用一個十六進制數來表示,因此每字節需要兩個十六進制數表示。
可以調用bytes對象的decode()方法將其解碼成字符串。
表2.3 Python支持的轉義字符
轉義字符 | 說明 |
\b | 退格符 |
\n | 換行符 |
\r | 回車符 |
\t | 製表符 |
\" | 雙引號 |
\' | 單引號 |
\\ | 反斜槓 |
Python提供了“%”對各種類型的數據進行格式化輸出:
price = 108
print("the book's price is %s" % price)
格式化字符串中的“%s”被成爲轉換說明符,作用相當於一個佔位符。
表2.4 轉換說明符
轉換說明符 | 說明 |
d,i | 轉換爲帶符號的十進制形式的整數 |
o | 轉換爲帶符號的八進制形式的整數 |
x | 轉換爲帶符號的十六進制形式的整數 |
X | 轉換爲帶符號的十六進制形式的整數 |
e | 轉換爲科學計數法表示的浮點數(e小寫) |
E | 轉換爲科學計數法表示的浮點數(E大寫) |
f, F | 轉換爲十進制形式的浮點數 |
g | 智能選擇使用f或者e格式 |
G | 智能選擇使用F或者E格式 |
r | 使用repr()將變量或表達式轉換爲字符串 |
s | 使用str()將變量或表達式轉換爲字符串 |
可以爲轉換說明符指定最小寬度:
num = -28
print("num is: %6i" % num)
print("num is: %6d" % num)
print("num is: %6o" % num)
print("num is: %6x" % num)
print("num is: %6X" % num)
print("num is: %6s" % num)
輸出結果:
num is: -28
num is: -28
num is: -34
num is: -1c
num is: -1C
num is: -28
默認情況下,轉換出來的字符串總是右對齊的,不夠寬度時左邊補充空格。可以在最小寬度之前添加一個標誌來改變這種行爲,python支持如下標誌:
● -:指定左對齊
● +:表示數值總要帶着符號(正數帶“+”,負數帶“-”)
● 0:表示不補充空格,而是補充0
對於浮點數,Python還允許指定小數點後的數字位數,對於字符串,Python允許指定轉換後字符串的最大字符數,這個該精度值被放在最小寬度之後:
my_value = 3.001415926535
# 最小寬度爲8,小數點後保留3位
print("my_value is: %8.3f" % my_value)
# 最小寬度爲8,小數點後保留3位,左邊補0
print("my_value is: %08.3f" % my_value)
# 最小寬度爲8,小數點後保留3位,左邊補0,始終帶符號
print("my_value is: %+08.3f" % my_value)
the_name = "Charlie"
# 值保留3個字符
print("the name is: %.3s" % the_name)
# 只保留2個字符,最小寬度爲10
print("the name is: %10.2s" % the_name)
輸出結果:
my_value is: 3.001
my_value is: 0003.001
my_value is: +003.001
the name is: Cha
the name is: Ch
Python是“自帶文檔”的,使用dir()函數列出指定類或模塊包含的全部內容(包括函數、方法、類、變量等),如:
>>> dir(str)
['__add__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mod__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmod__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'capitalize', 'casefold', 'center', 'count', 'encode', 'endswith', 'expandtabs', 'find', 'format', 'format_map', 'index', 'isalnum', 'isalpha', 'isascii', 'isdecimal', 'isdigit', 'isidentifier', 'islower', 'isnumeric', 'isprintable', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'maketrans', 'partition', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill']
使用help()函數查看某個函數或方法的幫助文檔:
>>> help(str.title)
Help on method_descriptor:
title(self, /)
Return a version of the string where each word is titlecased.
More specifically, words start with uppercased characters and all remaining
cased characters have lower case.
str類中大小寫先關常用方法:
● title():將每個單詞的首字母改爲大寫
● lower():將整個字符串改爲小寫
● upper():將整個字符串改爲大寫
str類中刪除空白的方法:
● strip():刪除字符串前後的空白
● lstrip():刪除字符串前面(左邊)的空白
● rstrip():刪除字符串侯建(右邊)的空白
str類中查找、替換相關方法
● startswith():判斷字符串是否以指定子串開頭
● endswith():判斷字符串是否以指定子串結尾
● find():查找指定子串在字符串中出現的位置,如果沒有找到則返回-1
● index():查找指定子串在字符串中出現的位置,如果沒有找到引發ValueError異常。
● replace():使用指定子串替換字符串中的目標子串
● translate():使用指定的翻譯映射表對字符串執行替換
Python爲str提供了maketrans()方法,可以方便的創建翻譯映射表:
>>> table = str.maketrans('abt', 'αβτ')
>>> table
{97: 945, 98: 946, 116: 964}
Python2.x中str類沒有maketrans()方法,需要導入string模塊,然後調用maketrans()函數。
str類中的分割、連接方法
● split():將字符串按指定分割符分割成多個短語
● join():將多個短語連接成字符串
五、運算符
運算符是一種特殊的符號,用來表示數據的運算、賦值和比較等。可分爲以下幾種:
● 賦值運算符
● 算術運算符
● 位運算符
● 索引運算符
● 比較運算符
● 邏輯運算符
1. 賦值運算符
Python使用“=”作爲賦值運算符
2. 算術運算符
+、-、*、/、//、%
3. 位運算符
&、|、^、~、<<、>>
表2.5 位運算符的運算法則
第一個操作數 | 第二個操作數 | 按位與 | 按位或 | 按位異或 |
0 | 0 | 0 | 0 | 0 |
0 | 1 | 0 | 1 | 1 |
1 | 0 | 0 | 1 | 1 |
1 | 1 | 1 | 1 | 0 |
補碼計算規則:整數的補碼和原碼相同,負數的補碼是其反碼加1
4. 擴展後的賦值運算符
+=、-=、*=、/=、//=、%=、**=、&=、|=、^=、<<=、>>=
5. 索引運算符
索引運算符就是方括號[],可以使用單個索引值也可以使用範圍以及步長。
6. 比較運算符與bool類型
Python的bool類型只有兩個值True和False
>、>=、<、<=、==、!=、is、is not
7. 邏輯運算符
and、or、not
8. 三目運算符
True_statements if expression else False_statements
運算規則:先對邏輯表達式expression求值,如果值爲True,則執行並返回True_statements,否則執行並返回False_statement的值。
Python允許在三目運算符的True_statements或False_statements中放置多條語句,有兩種方式:
● 以英文逗號分隔:每條語句都會執行,程序返回多條語句的返回值組成的元組
● 以英文分號分隔:每條語句都會執行,程序只返回第一條語句的返回值
a = 5
b = 3
# 以逗號分隔
st = print("crazyit"), 'a大於b' if a > b else 'a不大於b'
print(st)
# 以分號分隔
st = print("crazyit"); x = 20 if a > b else 'a不大於b'
print(st)
print(x)
輸出結果:
crazyit
(None, 'a大於b')
crazyit
None
20
9. in運算符
用於判斷某個成員是否位於序列中。
10. 運算符的結合性和優先級
不要把一個表達式寫得過於複雜,可以分幾步來完成一個複雜的表達式
不要過多的依賴運算符的優先級來控制表達式的執行順序,儘量使用“()”來控制表達式的執行順序。
練習題:
1. 使用數值類型聲明多個變量,並使用不同方式爲不同的數值類型的變量賦值。熟悉每種數據類型的賦值規則和表示方式。
int_value = 10
bin_value = 0b12
oct_value = 0o23
hex_value = 0xff
float_value = 10.23
e_value = 3.14e2
plural_value = 10 + 4.3j
2 . 使用數學運算符、邏輯運算符編寫40 個表達式,先自行計算各表達式的值,然後通過程序輸出這些表達式的值進行對比,看看能否做到一切盡在掌握中。
a = 3
b = 5
c = 'hello'
d = 'world'
e = 0.2
f = 0.4
g = True
h = False
result = a + b # 8
print(result)
result = a - b # -2
print(result)
result = a * b # 15
print(result)
result = a / b # 0.6
print(result)
result = a // b # 0
print(result)
result = a % b # 2
print(result)
result = a ** b # 243
print(result)
result = c + d # helloworld
print(result)
result = g and h # False
print(result)
result = g or h # True
print(result)
result = not g # False
print(result)
result = e + f # 0.6
print(result)
result = e - f # -0.2
print(result)
result = e * f # 0.08
print(result)
result = e / f # 0.5
print(result)
result = e // f # 0.0
print(result)
result = e ** f # 0.5
print(result)
result = e % f # 0.2
print(result)
3. 從標準輸入讀取兩個整數並打印兩行,其中第一行輸出兩個整數的整除結果;第二行輸出兩個整數的帶小數的除法結果。不需要執行任何四捨五入或格式化操作。
num1 = input('請輸入第一個整數:')
num2 = input('請輸入第二個整數:')
value1 = int(num1) // int(num2)
value2 = int(num1) / int(num2)
print('第一個數整除第二個數的結果爲:', str(value1))
print('第一個數除以第二個數的結果爲:', str(value2))
4. 從標準輸入讀取兩個整數並打印三行,其中第一行包含兩個數的和;第二行包含兩個數的差(第一個數減第二個數):第三行包含兩個數的乘積結果。
num1 = int(input('請輸入一個整數:'))
num2 = int(input('請輸入另一個整數:'))
print('兩個數的和爲:', num1 + num2)
print('兩個數的差爲:', num1 - num2)
print('兩個數的積爲:', num1 * num2)
5. 用戶輸入一個字符串和一個子串,程序必須打印出給定子串在目標字符串中出現的次數。字符串遍歷將從左到右進行,而不是從右到左。例如給定‘ABCDCDC' 和'CDC',程序輸出“ 2 ”。
s1 = input('請輸入一個字符串:')
s2 = input('請輸入一個子串:')
s1_len = len(s1)
s2_len = len(s2)
count = 0
for i in range(s1_len - 1):
if s1[i:i+s2_len] == s2:
count += 1
print('子串在字符串中出現的次數:%d' % count)
6. 給定任意一個整數,打印出該整數的十進制、八進制、十六進制(大寫)、二進制形式的字符串。
num = 14
print('十進制形式爲:%d' % num)
print('二進制形式爲: %s' % bin(num))
print('八進制形式爲:%o' % num)
print('十六進制形式爲: %x' % num)
print('十六進制形式爲(大寫): %X' % num)
7. 通過學習我們知道str是不可變的,本程序要實現一個功能:用戶輸入一個字符串,修改該字符串中哪個位置的字符,程序就會輸出修改後的結果。比如用戶輸入:
’ fkjava. org ’
6 -
程序將會輸出: ’fkjava-org’ 。
s1 = input('請輸入一個字符串:')
index = int(input('請輸入一個位置:'))
s2 = input('請輸入替代字符:')
s_new = s1[:index] + s2 + s1[index+1:]
print(s_new)