目錄
格式化
%格式化(傳統方法)
format()方法(Python 2.6+)
f-string(Python 3.6+ 推薦)
簡單數據類型轉換
顯式類型轉換
隱式類型轉換
進制轉換
二進制轉十進制
十進制轉二進制
二進制轉八進制
八進制轉二進制
二進制轉十六進制
十六進制到二進制
八進制到十六進制
十六進制到八進制
不同進製表示
進制轉換函數
格式化輸出不同進制
運算符
算術運算符
比較運算符
邏輯運算符
位運算符
基礎位運算符
1. 按位與(AND) - &
2. 按位或(OR) - |
3. 按位異或(XOR) - ^
4. 按位取反(NOT) - ~
5. 左移(Left Shift) - <<
6. 右移(Right Shift) - >>
實際應用場景
實戰演示
實戰演示1:學生成績單生成器
實戰演示2:進制轉換計算器
實戰演示3:數學運算演示
實戰演示4:位運算實際應用
實戰演示5:綜合應用 - 簡單計算器
每日一題
總結
格式化
最後一個常見的問題是如何輸出格式化的字符串。我們經常會輸出類似'親愛的xxx你好!你xx月的話費是xx,餘額是xx'之類的字符串,而xxx的內容都是根據變量變化的,所以,需要一種簡便的格式化字符串的方式。
%格式化(傳統方法)
在Python中,採用的格式化方式和C語言是一致的,用%實現,舉例如下:
>>> 'Hello, %s' % 'world' # 一個佔位符可以不寫括號
'Hello, world'
>>> 'Hi, %s, you have $%d.' % ('Michael', 1000000)
'Hi, Michael, you have $1000000.'
你可能猜到了,%運算符就是用來格式化字符串的。在字符串內部,%s表示用字符串替換,%d表示用整數替換,有幾個%?佔位符,後面就跟幾個變量或者值,順序要對應好。如果只有一個%?,括號可以省略。
常見的佔位符有:
|
佔位符
|
替換內容
|
|
%d
|
整數
|
|
%f
|
浮點數
|
|
%s
|
字符串
|
|
%x
|
十六進制整數
|
# 基本用法
name = "張三"
age = 25
print("我叫%s,今年%d歲" % (name, age))
# 常用格式符
# %s - 字符串
# %d - 十進制整數
# %f - 浮點數
# %x - 十六進制數
# 示例
price = 15.8
quantity = 3
total = price * quantity
print("單價:%.2f元,數量:%d個,總計:%.2f元" % (price, quantity, total))
其中,格式化整數和浮點數還可以指定是否補0和整數與小數的位數:
# 第一個%2d表示佔2個位置,如果只有一個數字就補空格
# 第二個%02d表示佔2個位置,如果只有一個數字就補0
print('%2d-%02d' % (3, 1))
# 表示保留2位小數
print('%.2f' % 3.1415926)
"""
輸出結果:
3-01
3.14
"""
# 注意:第一個結果前面有控格
如果你不太確定應該用什麼,%s永遠起作用,它會把任何數據類型轉換為字符串:
>>> 'Age: %s. Gender: %s' % (25, True)
'Age: 25. Gender: True'
有些時候,字符串裏面的%是一個普通字符怎麼辦?這個時候就需要轉義,用%%來表示一個%:
>>> 'growth rate: %d %%' % 7
'growth rate: 7 %'
注意:這裏不要使用\符號進行轉義
format()方法(Python 2.6+)
另一種格式化字符串的方法是使用字符串的format()方法,它會用傳入的參數依次替換字符串內的佔位符{0}、{1}……,不過這種方式寫起來比%要麻煩得多:
>>> 'Hello, {0}, 成績提升了 {1:.1f}%'.format('小明', 17.125)
'Hello, 小明, 成績提升了 17.1%'
# 基本用法
name = "李四"
age = 30
print("我叫{},今年{}歲".format(name, age))
# 位置參數
print("{0}喜歡{1},{1}也喜歡{0}".format("小明", "小紅"))
# 關鍵字參數
print("姓名:{name},年齡:{age},城市:{city}".format(
name="王五", age=28, city="北京"))
# 數字格式化
pi = 3.1415926
print("圓周率:{:.2f}".format(pi)) # 保留2位小數
print("數字:{:06d}".format(42)) # 寬度6,不足補0
f-string(Python 3.6+ 推薦)
最後一種格式化字符串的方法是使用以f開頭的字符串,稱之為f-string,它和普通字符串不同之處在於,字符串如果包含{xxx},就會以對應的變量替換:
>>> r = 2.5
>>> s = 3.14 * r ** 2
>>> print(f'The area of a circle with radius {r} is {s:.2f}')
The area of a circle with radius 2.5 is 19.62
上述代碼中,{r}被變量r的值替換,{s:.2f}被變量s的值替換,並且:後面的.2f指定了格式化參數(即保留兩位小數),因此,{s:.2f}的替換結果是19.62。
# 基本用法
name = "趙六"
age = 35
print(f"我叫{name},今年{age}歲")
# 表達式計算
a = 10
b = 20
print(f"{a} + {b} = {a + b}")
# 數字格式化
price = 99.99
count = 5
print(f"單價:{price:.2f}元")
print(f"總計:{price * count:.2f}元")
簡單數據類型轉換
數據類型轉換是將一個數據類型轉換為另一個數據類型的過程。
顯式類型轉換
|
函數
|
作用
|
|
int()
|
將數字轉換為整數
|
|
str()
|
將數字轉換為字符串
|
|
float()
|
將數字轉換為浮點數
|
|
bool()
|
將原類型轉換為布爾型
|
# 字符串轉數字
str_num = "123"
int_num = int(str_num) # 轉整數
float_num = float("3.14") # 轉浮點數
print(f"字符串'{str_num}'轉整數:{int_num}")
# 數字轉字符串
num = 456
str_result = str(num)
print(f"數字{num}轉字符串:'{str_result}'")
# 布爾值轉換
bool_true = bool(1) # True
bool_false = bool(0) # False
bool_str = bool("Hello") # True
bool_empty = bool("") # False
print(f"bool(1) = {bool_true}")
print(f"bool(0) = {bool_false}")
print(f"bool('Hello') = {bool_str}")
print(f"bool('') = {bool_empty}")
隱式類型轉換
# 整數和浮點數運算
result1 = 10 + 3.14 # 整數自動轉為浮點數
print(f"10 + 3.14 = {result1}")
# 布爾值參與運算
result2 = True + 5 # True轉為1
result3 = False * 10 # False轉為0
print(f"True + 5 = {result2}")
print(f"False * 10 = {result3}")
# 字符串拼接時的轉換
name = "小明"
age = 18
# 需要顯式轉換,否則會報錯
message = name + "今年" + str(age) + "歲"
print(message)
進制轉換
二進制轉十進制
原理:二進制數使用基數為2,每個位上的數字乘以2的冪次(從右向左,冪次從0開始),然後求和。步驟:
- 寫出二進制數的每個位。
- 從右向左,給每個位分配權重:2^0, 2^1, 2^2, ...。
- 將每個位乘以對應的權重。
- 將所有乘積相加,得到十進制數。
例子:將二進制數1011轉換為十進制。
- 最右邊位(最低位):1 × 2^0 = 1 × 1 = 1
- 下一位:1 × 2^1 = 1 × 2 = 2
- 下一位:0 × 2^2 = 0 × 4 = 0
- 最左邊位(最高位):1 × 2^3 = 1 × 8 = 8
- 求和:1 + 2 + 0 + 8 = 11所以,1011₂ = 11₁₀。
十進制轉二進制
原理:通過連續除以2,記錄餘數,直到商為0,然後從下往上讀取餘數。步驟:
- 將十進制數除以2,記錄商和餘數。
- 用商繼續除以2,記錄餘數,重複直到商為0。
- 將餘數從下往上(最後一次除法的餘數在最左邊)排列,得到二進制數。
例子:將十進制數11轉換為二進制。
- 11 ÷ 2 = 5 ... 餘1
- 5 ÷ 2 = 2 ... 餘1
- 2 ÷ 2 = 1 ... 餘0
- 1 ÷ 2 = 0 ... 餘1從下往上讀取餘數:1011所以,11₁₀ = 1011₂。
二進制轉八進制
原理:八進制基數為8,每個八進制位對應3個二進制位(因為2^3=8)。從二進制數的小數點開始,向左和向右分組,每3位一組(不足3位時補零),然後將每組轉換為八進制數。步驟:
- 從二進制數的小數點位置開始,向左(整數部分)和向右(小數部分)分組,每3位一組。
- 如果最左邊或最右邊一組不足3位,補零。
- 將每組二進制數轉換為八進制數(使用二進制到十進制的原理,但只處理3位)。
例子:將二進制數1011101轉換為八進制。
- 二進制數:1011101(沒有小數點,視為整數)。
- 從右向左分組:101(最右邊3位)、011(中間3位)、001(最左邊只有1位,補零成001)。
- 轉換每組:
- 001₂ = 1₈
- 011₂ = 3₈
- 101₂ = 5₈
- 組合:135所以,1011101₂ = 135₈。
八進制轉二進制
原理:將每個八進制位轉換為3位二進制數。步驟:
- 將八進制數的每個位單獨處理。
- 將每個八進制位轉換為3位二進制數(使用十進制到二進制的原理,但只處理0-7)。
- 組合所有二進制組,忽略前導零。
例子:將八進制數135轉換為二進制。
- 1₈ = 001₂
- 3₈ = 011₂
- 5₈ = 101₂
- 組合:001011101,省略前導零後為1011101₂。所以,135₈ = 1011101₂。
二進制轉十六進制
原理:十六進制基數為16,每個十六進制位對應4個二進制位(因為2^4=16)。從二進制數的小數點開始,向左和向右分組,每4位一組(不足4位時補零),然後將每組轉換為十六進制數(0-9和A-F)。步驟:
- 從二進制數的小數點位置開始,向左和向右分組,每4位一組。
- 如果最左邊或最右邊一組不足4位,補零。
- 將每組二進制數轉換為十六進制數。
例子:將二進制數1011101轉換為十六進制。
- 二進制數:1011101。
- 從右向左分組:1101(最右邊4位)、0101(最左邊4位,補零成0101)。
- 轉換每組:
- 0101₂ = 5₁₆
- 1101₂ = D₁₆(13十進制)
- 組合:5D所以,1011101₂ = 5D₁₆。
十六進制到二進制
原理:將每個十六進制位轉換為4位二進制數。步驟:
- 將十六進制數的每個位單獨處理。
- 將每個十六進制位轉換為4位二進制數。
- 組合所有二進制組,忽略前導零。
例子:將十六進制數5D轉換為二進制。
- 5₁₆ = 0101₂
- D₁₆ = 1101₂
- 組合:01011101,省略前導零後為1011101₂。所以,5D₁₆ = 1011101₂。
八進制到十六進制
原理:通常以二進制作為中介。先將八進制轉換為二進制,然後將二進制轉換為十六進制。步驟:
- 將八進制數轉換為二進制(每個八進制位轉3位二進制)。
- 將得到的二進制數轉換為十六進制(每4位一組)。
例子:將八進制數135轉換為十六進制。
- 首先,135₈ 轉換為二進制:
- 1₈ = 001₂
- 3₈ = 011₂
- 5₈ = 101₂
- 組合:001011101₂ = 1011101₂(省略前導零)。
- 然後將1011101₂ 轉換為十六進制:
- 分組:0101(左邊補零)、1101。
- 0101₂ = 5₁₆
- 1101₂ = D₁₆
- 組合:5D所以,135₈ = 5D₁₆。
十六進制到八進制
原理:以二進制作為中介。先將十六進制轉換為二進制,然後將二進制轉換為八進制。步驟:
- 將十六進制數轉換為二進制(每個十六進制位轉4位二進制)。
- 將得到的二進制數轉換為八進制(每3位一組)。
例子:將十六進制數5D轉換為八進制。
- 首先,5D₁₆ 轉換為二進制:
- 5₁₆ = 0101₂
- D₁₆ = 1101₂
- 組合:01011101₂ = 1011101₂(省略前導零)。
- 然後將1011101₂ 轉換為八進制:
- 分組:001(左邊補零)、011、101。
- 001₂ = 1₈
- 011₂ = 3₈
- 101₂ = 5₈
- 組合:135所以,5D₁₆ = 135₈。
不同進製表示
# 不同進制的字面量表示
decimal = 100 # 十進制
binary = 0b1100100 # 二進制(前綴0b)
octal = 0o144 # 八進制(前綴0o)
hexadecimal = 0x64 # 十六進制(前綴0x)
print(f"十進制:{decimal}")
print(f"二進制:{binary}")
print(f"八進制:{octal}")
print(f"十六進制:{hexadecimal}")
進制轉換函數
# 十進制轉其他進制
num = 255
# 轉二進制
bin_str = bin(num)
print(f"{num} 的二進制:{bin_str}")
# 轉八進制
oct_str = oct(num)
print(f"{num} 的八進制:{oct_str}")
# 轉十六進制
hex_str = hex(num)
print(f"{num} 的十六進制:{hex_str}")
# 其他進制轉十進制
# 使用int()函數,第二個參數指定進制
binary_num = "11111111"
decimal_from_bin = int(binary_num, 2)
print(f"二進制{binary_num}轉十進制:{decimal_from_bin}")
octal_num = "377"
decimal_from_oct = int(octal_num, 8)
print(f"八進制{octal_num}轉十進制:{decimal_from_oct}")
hex_num = "FF"
decimal_from_hex = int(hex_num, 16)
print(f"十六進制{hex_num}轉十進制:{decimal_from_hex}")
格式化輸出不同進制
基於前面學習的f-string格式化
|
代碼
|
意義
|
|
{變量:d}
|
表示十進制輸出
|
|
{變量:b}
|
表示二進制輸出
|
|
{變量:o}
|
表示八進制輸出
|
|
{變量:x}
|
表示十六進制輸出,字母小寫
|
|
{變量:X}
|
表示十六進制輸出,字母大寫
|
|
{變量:#b}
|
表示帶前綴的二進制輸出,例如0b101010
|
|
{變量:#o}
|
表示帶前綴的八進制輸出,例如0o52
|
|
{變量:#x}
|
表示帶前綴的十六進制輸出,例如0x2a
|
num = 42
# 使用格式化輸出不同進制
print(f"十進制:{num:d}") # 42
print(f"二進制:{num:b}") # 101010
print(f"八進制:{num:o}") # 52
print(f"十六進制:{num:x}") # 2a(小寫)
print(f"十六進制:{num:X}") # 2A(大寫)
# 帶前綴的格式化
print(f"二進制:{num:#b}") # 0b101010
print(f"八進制:{num:#o}") # 0o52
print(f"十六進制:{num:#x}") # 0x2a
運算符
算術運算符
|
符號
|
意義
|
|
+
|
表示加法運算
|
|
-
|
表示減法運算
|
|
*
|
表示乘法運算
|
|
/
|
表示除法運算
|
|
%
|
表示餘運算
|
|
**
|
表示冪運算
|
a = 10
b = 3
print(f"a = {a}, b = {b}")
print(f"加法:a + b = {a + b}") # 13
print(f"減法:a - b = {a - b}") # 7
print(f"乘法:a * b = {a * b}") # 30
print(f"除法:a / b = {a / b}") # 3.333...
print(f"取整:a // b = {a // b}") # 3
print(f"取餘:a % b = {a % b}") # 1
print(f"冪運算:a ** b = {a ** b}") # 1000
# 特殊用法
print(f"字符串重複:{'hi' * 3}") # hihihi
比較運算符
|
符號
|
意義
|
|
>
|
大於運算
|
|
<
|
小於運算
|
|
==
|
等於運算
|
|
!=
|
不等於運算
|
x = 10
y = 20
print(f"x = {x}, y = {y}")
print(f"等於:x == y -> {x == y}") # False
print(f"不等於:x != y -> {x != y}") # True
print(f"大於:x > y -> {x > y}") # False
print(f"小於:x < y -> {x < y}") # True
print(f"大於等於:x >= y -> {x >= y}") # False
print(f"小於等於:x <= y -> {x <= y}") # True
# 字符串比較(按編碼序)
print(f"字符串比較:'apple' < 'banana' -> {'apple' < 'banana'}") # True
邏輯運算符
|
符號
|
意義
|
|
and
|
同時滿足
|
|
or
|
其中一個滿足
|
|
not
|
取反
|
a = True
b = False
print(f"a = {a}, b = {b}")
print(f"與:a and b -> {a and b}") # False
print(f"或:a or b -> {a or b}") # True
print(f"非:not a -> {not a}") # False
# 實際應用
age = 20
has_license = True
can_drive = age >= 18 and has_license
print(f"年齡{age}歲,有駕照:{has_license},可以開車:{can_drive}")
位運算符
|
符號
|
意義
|
|
&
|
與運算,兩位都為1則為1
|
|
|
|
或運算,其中一位為1則為1
|
|
^
|
異或運算,兩位不相同則為1
|
|
~
|
按位取反(NOT),0變1,1變0
|
|
<<
|
左移,所有位向左移動,低位補0
|
|
>>
|
右移, 所有位向右移動,高位補0(邏輯右移)
|
位運算是直接對整數在內存中的二進制位進行操作的一種運算。它們在底層編程、算法優化、加密等領域有廣泛應用。下面我將詳細講解各種位運算符及其應用。
基礎位運算符
1. 按位與(AND) - &
規則:兩個位都為1時,結果才為1
0 & 0 = 0
0 & 1 = 0
1 & 0 = 0
1 & 1 = 1
例子:
a = 5 # 二進制: 0101
b = 3 # 二進制: 0011
result = a & b # 0101 & 0011 = 0001 = 1
print(result) # 輸出: 1
應用:
- 判斷奇偶:
n & 1(為1是奇數,為0是偶數) - 清零特定位
- 取指定位
2. 按位或(OR) - |
規則:兩個位有一個為1時,結果就為1
0 | 0 = 0
0 | 1 = 1
1 | 0 = 1
1 | 1 = 1
例子:
a = 5 # 0101
b = 3 # 0011
result = a | b # 0101 | 0011 = 0111 = 7
print(result) # 輸出: 7
應用:
- 設置特定位為1
- 合併標誌位
3. 按位異或(XOR) - ^
規則:兩個位不同時結果為1,相同時結果為0
0 ^ 0 = 0
0 ^ 1 = 1
1 ^ 0 = 1
1 ^ 1 = 0
例子:
a = 5 # 0101
b = 3 # 0011
result = a ^ b # 0101 ^ 0011 = 0110 = 6
print(result) # 輸出: 6
重要性質:
- 交換律:
a ^ b = b ^ a - 結合律:
(a ^ b) ^ c = a ^ (b ^ c) - 自反性:
a ^ a = 0 - 與0異或:
a ^ 0 = a
應用:
- 交換兩個數(不用臨時變量)
- 找出現奇數次的數字
- 簡單加密
4. 按位取反(NOT) - ~
規則:0變1,1變0
~0 = 1 ~1 = 0
例子:
a = 5 # 0101
result = ~a # 在Python中,~5 = -6
print(result) # 輸出: -6
注意:在大多數編程語言中,整數用補碼錶示,所以 ~n = -n - 1
5. 左移(Left Shift) - <<
規則:所有位向左移動,低位補0
a << n # 將a的二進制位左移n位
例子:
a = 5 # 0101
result = a << 2 # 0101 << 2 = 010100 = 20
print(result) # 輸出: 20
數學意義:a << n = a × 2ⁿ
5 << 1 = 10(5×2=10)5 << 2 = 20(5×4=20)5 << 3 = 40(5×8=40)
6. 右移(Right Shift) - >>
規則:所有位向右移動,高位補0(邏輯右移)或補符號位(算術右移)
例子:
a = 20 # 10100
result = a >> 2 # 10100 >> 2 = 00101 = 5
print(result) # 輸出: 5
數學意義:a >> n = a ÷ 2ⁿ(向下取整)
20 >> 1 = 10(20÷2=10)20 >> 2 = 5(20÷4=5)20 >> 3 = 2(20÷8=2.5→2)
實際應用場景
- 算法優化:在動態規劃、搜索算法中用於狀態壓縮
- 系統編程:操作系統、網絡協議中的標誌位處理
- 圖形學:顏色操作、圖像處理
- 加密算法:異或運算用於簡單加密
- 遊戲開發:碰撞檢測、狀態管理
- 數據庫:位圖索引
位運算的強大之處在於它的高效性,這些操作通常在單個CPU週期內完成,比相應的算術運算快得多。掌握位運算可以讓你寫出更高效、更優雅的代碼。
實戰演示
實戰演示1:學生成績單生成器
# 實戰演示1:學生成績單生成器
print("=" * 50)
print(" 學生成績單生成器")
print("=" * 50)
# 學生基本信息
student_name = "張三"
student_id = "2023001"
chinese_score = 85.5
math_score = 92.0
english_score = 78.5
# 計算總分和平均分
total_score = chinese_score + math_score + english_score
average_score = total_score / 3
# 使用不同的字符串格式化方法輸出
print("\n【使用%格式化輸出】")
print("學生姓名:%s" % student_name)
print("學號:%s" % student_id)
print("語文:%.1f分,數學:%.1f分,英語:%.1f分" % (chinese_score, math_score, english_score))
print("總分:%.1f分,平均分:%.1f分" % (total_score, average_score))
print("\n【使用format方法輸出】")
print("學生姓名:{}".format(student_name))
print("學號:{}".format(student_id))
print("語文:{:.1f}分,數學:{:.1f}分,英語:{:.1f}分".format(chinese_score, math_score, english_score))
print("總分:{:.1f}分,平均分:{:.1f}分".format(total_score, average_score))
print("\n【使用f-string輸出】")
print(f"學生姓名:{student_name}")
print(f"學號:{student_id}")
print(f"語文:{chinese_score:.1f}分,數學:{math_score:.1f}分,英語:{english_score:.1f}分")
print(f"總分:{total_score:.1f}分,平均分:{average_score:.1f}分")
# 數據類型轉換演示
print("\n" + "=" * 50)
print(" 數據類型轉換演示")
print("=" * 50)
# 字符串轉數字
score_str = "95.5"
converted_score = float(score_str)
print(f"字符串 '{score_str}' 轉換為浮點數:{converted_score}")
# 數字轉字符串
age = 18
age_str = str(age)
print(f"數字 {age} 轉換為字符串:'{age_str}'")
# 布爾值轉換
has_scholarship = True
print(f"是否有獎學金:{has_scholarship},轉換為整數:{int(has_scholarship)}")
實戰演示2:進制轉換計算器
# 實戰演示2:進制轉換計算器
print("\n" + "=" * 50)
print(" 進制轉換計算器")
print("=" * 50)
# 定義一個十進制數
decimal_number = 42
print(f"原始十進制數:{decimal_number}")
# 轉換為其他進制
binary_number = bin(decimal_number)
octal_number = oct(decimal_number)
hexadecimal_number = hex(decimal_number)
print(f"二進制:{binary_number}")
print(f"八進制:{octal_number}")
print(f"十六進制:{hexadecimal_number}")
# 使用格式化輸出不同進制
print("\n【使用格式化輸出進制】")
print(f"十進制:{decimal_number:d}")
print(f"二進制:{decimal_number:b}")
print(f"八進制:{decimal_number:o}")
print(f"十六進制(小寫):{decimal_number:x}")
print(f"十六進制(大寫):{decimal_number:X}")
print("\n【帶前綴的格式化輸出】")
print(f"二進制:{decimal_number:#b}")
print(f"八進制:{decimal_number:#o}")
print(f"十六進制:{decimal_number:#x}")
# 其他進制轉十進制
print("\n" + "=" * 50)
print(" 其他進制轉十進制")
print("=" * 50)
binary_str = "101010"
octal_str = "52"
hex_str = "2A"
decimal_from_binary = int(binary_str, 2)
decimal_from_octal = int(octal_str, 8)
decimal_from_hex = int(hex_str, 16)
print(f"二進制 '{binary_str}' 轉十進制:{decimal_from_binary}")
print(f"八進制 '{octal_str}' 轉十進制:{decimal_from_octal}")
print(f"十六進制 '{hex_str}' 轉十進制:{decimal_from_hex}")
實戰演示3:數學運算演示
# 實戰演示3:數學運算演示
print("\n" + "=" * 50)
print(" 數學運算演示")
print("=" * 50)
# 定義兩個數字
a = 15
b = 4
print(f"a = {a}, b = {b}")
# 算術運算
print("\n【算術運算】")
print(f"加法:{a} + {b} = {a + b}")
print(f"減法:{a} - {b} = {a - b}")
print(f"乘法:{a} × {b} = {a * b}")
print(f"除法:{a} ÷ {b} = {a / b}")
print(f"取整除法:{a} ÷ {b} = {a // b}")
print(f"取餘:{a} % {b} = {a % b}")
print(f"冪運算:{a} 的 {b} 次方 = {a ** b}")
# 比較運算
print("\n【比較運算】")
print(f"{a} > {b} -> {a > b}")
print(f"{a} < {b} -> {a < b}")
print(f"{a} == {b} -> {a == b}")
print(f"{a} != {b} -> {a != b}")
print(f"{a} >= {b} -> {a >= b}")
print(f"{a} <= {b} -> {a <= b}")
# 邏輯運算
print("\n【邏輯運算】")
x = True
y = False
print(f"x = {x}, y = {y}")
print(f"x and y -> {x and y}")
print(f"x or y -> {x or y}")
print(f"not x -> {not x}")
print(f"not y -> {not y}")
# 實際應用場景
print("\n【實際應用場景】")
age = 20
has_id_card = True
has_money = False
can_enter_bar = age >= 18 and has_id_card
can_buy_drink = age >= 18 or has_money
print(f"年齡:{age}歲,有身份證:{has_id_card},有錢:{has_money}")
print(f"可以進入酒吧:{can_enter_bar}")
print(f"可以買飲料:{can_buy_drink}")
實戰演示4:位運算實際應用
# 實戰演示4:位運算實際應用
print("\n" + "=" * 50)
print(" 位運算實際應用")
print("=" * 50)
# 定義兩個數字
num1 = 12 # 二進制:1100
num2 = 10 # 二進制:1010
print(f"num1 = {num2:b} ({num1})")
print(f"num2 = {num2:b} ({num2})")
# 位運算
print("\n【位運算】")
print(f"按位與:{num1:b} & {num2:b} = {num1 & num2:b} ({num1 & num2})")
print(f"按位或:{num1:b} | {num2:b} = {num1 | num2:b} ({num1 | num2})")
print(f"按位異或:{num1:b} ^ {num2:b} = {num1 ^ num2:b} ({num1 ^ num2})")
print(f"按位取反:~{num1:b} = {~num1 & 0b1111:b} ({~num1 & 0b1111})")
print(f"左移:{num1:b} << 1 = {num1 << 1:b} ({num1 << 1})")
print(f"右移:{num1:b} >> 1 = {num1 >> 1:b} ({num1 >> 1})")
# 實際應用:權限系統(簡化版)
print("\n【權限系統應用】")
# 定義權限常量
READ_PERMISSION = 0b001 # 1
WRITE_PERMISSION = 0b010 # 2
EXECUTE_PERMISSION = 0b100 # 4
# 用户權限
user_permissions = READ_PERMISSION | WRITE_PERMISSION # 有讀和寫權限
print(f"用户權限:{user_permissions:03b}")
# 檢查權限
has_read = (user_permissions & READ_PERMISSION) == READ_PERMISSION
has_write = (user_permissions & WRITE_PERMISSION) == WRITE_PERMISSION
has_execute = (user_permissions & EXECUTE_PERMISSION) == EXECUTE_PERMISSION
print(f"有讀權限:{has_read}")
print(f"有寫權限:{has_write}")
print(f"有執行權限:{has_execute}")
實戰演示5:綜合應用 - 簡單計算器
# 實戰演示5:綜合應用 - 簡單計算器
print("\n" + "=" * 50)
print(" 綜合應用 - 簡單計算器")
print("=" * 50)
# 定義計算數據
number1 = 25
number2 = 7
number3 = 3.14
print(f"數字1:{number1}")
print(f"數字2:{number2}")
print(f"數字3:{number3}")
# 綜合運算
print("\n【綜合運算結果】")
# 算術運算
addition = number1 + number2
subtraction = number1 - number2
multiplication = number1 * number2
division = number1 / number2
modulo = number1 % number2
power = number1 ** number3
print(f"加法:{number1} + {number2} = {addition}")
print(f"減法:{number1} - {number2} = {subtraction}")
print(f"乘法:{number1} × {number2} = {multiplication}")
print(f"除法:{number1} ÷ {number2} = {division:.2f}")
print(f"取餘:{number1} % {number2} = {modulo}")
print(f"冪運算:{number1} 的 {number3} 次方 = {power:.2f}")
# 數據類型轉換
print("\n【數據類型轉換】")
str_number = "100"
int_from_str = int(str_number)
float_from_str = float(str_number)
print(f"字符串 '{str_number}' 轉整數:{int_from_str}")
print(f"字符串 '{str_number}' 轉浮點數:{float_from_str}")
# 進制轉換
print("\n【進制轉換】")
print(f"十進制 {number1} 的二進制:{bin(number1)}")
print(f"十進制 {number1} 的八進制:{oct(number1)}")
print(f"十進制 {number1} 的十六進制:{hex(number1)}")
# 格式化輸出
print("\n【格式化輸出展示】")
print("使用%格式化:數字1=%d,數字2=%d,結果=%.2f" % (number1, number2, division))
print("使用format:數字1={},數字2={},結果={:.2f}".format(number1, number2, division))
print(f"使用f-string:數字1={number1},數字2={number2},結果={division:.2f}")
# 綜合表達式
print("\n【綜合表達式計算】")
complex_result = (number1 + number2) * number3 - (number1 % number2)
print(f"({number1} + {number2}) × {number3} - ({number1} % {number2}) = {complex_result:.2f}")
每日一題
題目要求:綜合運用今天學習的所有知識,創建一個個人數字名片程序。
名片包含信息:
- 基本信息:姓名、年齡、職業
- 聯繫方式:電話(數字)、郵箱
- 技能評分:編程能力(0-100)、英語水平(0-100)
- 特殊編碼:個人ID(用二進制、八進制、十六進制表示年齡)
功能要求:
- 使用三種字符串格式化方法分別展示不同部分的信息
- 計算技能平均分
- 將年齡轉換為不同進制顯示
- 使用各種運算符進行簡單的數據分析
- 格式化輸出美觀的名片
輸出示例:
text
================================
個人數字名片
================================
姓名:張偉
年齡:28歲(二進制:11100,八進制:34,十六進制:1C)
職業:軟件工程師
電話:13800138000
郵箱:zhangwei@email.com
編程能力:85分,英語水平:78分
技能平均分:81.5分
================================
請編寫完整的個人數字名片程序。
總結
今天的所有實戰演示都嚴格基於已學知識:
- 字符串格式化:使用了%格式化、format()方法和f-string
- 數據類型轉換:演示了int()、float()、str()、bool()的用法
- 進制轉換:展示了bin()、oct()、hex()和int()的進制轉換功能
- 運算符:涵蓋了算術、比較、邏輯、位運算符的使用
每個實戰演示都聚焦於一個具體的應用場景,通過實際的代碼示例幫助你鞏固所學知識。建議你親自運行這些代碼,並嘗試修改其中的數值和變量,觀察不同的輸出結果,這樣可以更好地理解和掌握今天的內容。