Python基礎
- 變量、運算符與資料類型
-
- 1.變量
- 2.運算符
- 3.注釋
- 4 其他
-
-
- 4.1 instance
- 4.2 end參數
-
- 5.練習題
- 6.位運算
- 7.練習題
變量、運算符與資料類型
1.變量
變量是存儲在記憶體中的值。在建立變量時會在記憶體中開辟一個空間。基于變量的資料類型,解釋器會配置設定指定記憶體,并決定什麼資料可以被存儲在記憶體中。是以,變量可以指定不同的資料類型,這些變量可以存儲整數,小數或字元。
- 變量的指派:每個變量在使用前都必須指派,變量指派以後該變量才會被建立。等号(=)用來給變量指派。
-
标準資料類型:
(1)Numbers(數字):
Python支援四種不同的數字類型:
int(有符号整型)
long(長整型[也可以代表八進制和十六進制])
float(浮點型)
complex(複數)
(2)String(字元串):
字元串或串(String)是由數字、字母、下劃線組成的一串字元。
(3)List(清單):
清單用 [ ] 辨別,是 python 最通用的複合資料類型。
(4)Tuple(元組):
元組用 () 辨別。内部元素用逗号隔開。但是元組不能二次指派,相當于隻讀清單。
(5)Dictionary(字典):
清單是有序的對象集合,字典是無序的對象集合。
兩者之間的差別在于:字典當中的元素是通過鍵來存取的,而不是通過偏移存取。字典用"{ }"辨別。字典由索引(key)和它對應的值value組成。
基本類型:整型、浮點型、布爾型
容器類型:字元串、元組、清單、字典和集合
确定bool(X) 的值是 True 還是 False,就看 X 是不是空,空的話就是 False,不空的話就是 True。
對于數值變量,0, 0.0 都可認為是空的。
對于容器變量,裡面沒元素就是空的。
dict = {}
dict['one'] = "This is one"
dict[2] = "This is two"
tinydict = {'name': 'runoob','code':6734, 'dept': 'sales'}
print dict['one'] # 輸出鍵為'one' 的值
print dict[2] # 輸出鍵為 2 的值
print tinydict # 輸出完整的字典
print tinydict.keys() # 輸出所有鍵
print tinydict.values() # 輸出所有值
例子:找到一個整數的二進制表示,再傳回其長度。
a = 1031
print(bin(a)) #0b10000000111
print(a.bit_length()) #11
有時候我們想保留浮點型的小數點後 n 位。可以用 decimal 包裡的 Decimal 對象和 getcontext() 方法來實作。
import decimal
from decimal import Decimal
a = decimal.getcontext()
print(a)
# Context(prec=28, rounding=ROUND_HALF_EVEN, Emin=-999999, Emax=999999,
# capitals=1,clamp=0,flags=[],
#traps=[InvalidOperation,DivisionByZero,Overflow])
b=Decimal(1)/Decimal(3)
print(b)
#0.3333333333333333333333333333
【例子】使 1/3 保留 4 位,用 getcontext().prec 來調整精度。
decimal.getcontext().prec = 4
c = Decimal(1) / Decimal(3)
print(c)
# 0.3333
2.運算符
2.1算術運算符:
運算符 | 描述 |
---|---|
+ | 加 |
- | 減 |
* | 乘 |
/ | 除 |
** | 幂 |
% | 取模:傳回除法的餘數 |
// | (向下)取整:傳回商的整數部分 |
print(3//4) # 0
print(3%4) # 3
print(2**3) # 8
2.2 比較運算符:

2.3 指派運算符:
2.4 位運算符:
a = 0011 1100
b = 0000 1101
-----------------
a&b = 0000 1100
a|b = 0011 1101
a^b = 0011 0001
~a = 1100 0011
運算符 | 描述 |
---|---|
& | 按位與 |
I | 按位或 |
^ | 按位異或,當兩對應的二進位相異時結果為1 |
~ | 按位取反,~x 類似于 -x-1 |
<< | 左移 |
>> | 右移 |
print(bin(4))
# 0b100
print(bin(~4),~4)
# -0b101 -5
print(bin(4<<2),4<<2)
# 0b10000 16
print(bin(4>>2),4>>2)
# 0b1 1
2.5 邏輯運算符:
2.6 成員運算符:
2.7 身份運算符:
注意:
is,is not對比的是兩個變量的記憶體位址==,!=對比的是兩個變量的值比較的兩個變量,指向的都是位址不可變的類型(str等),那麼is,is not和==,=是完全等價的。
對比的兩個變量,指向的是位址可變的類型(list,dict等),則兩者是有差別的。
a = "hello"
b = "hello"
print(a is b, a==b) # True True
print(a is not b, a!=b) # False False
a = ["hello"]
b = ["hello"]
print(a is b, a==b) # False True
print(a is not b, a!=b) # True False
2.8 三元運算符
x, y=4, 5
if x<y:
small=x
else:
small=y
print(small) # 4
x, y=4, 5
small = x if x < y else y
print(small) # 4
2.8 運算符的優先級
一進制運算符優于二進制運算符。例如3**-2等價于3**(-2)。
先算術運算,後移位運算,最後位運算。例如1 << 3+2 & 7等價于1 << ((3+2)) & 7。
邏輯運算最後結合。例如3 < 4 and 4 < 5等價于(3 < 4) and (4 < 5)。
3.注釋
在Python中,#表示注釋,作用于整行。
單行注釋:
#這是一個注釋
多行注釋:’’’’’'或者""""""表示區間注釋,在三引号之間的所有内容被注釋
'''
這是多行注釋,用三個單引号
這是多行注釋,用三個單引号
這是多行注釋,用三個單引号
'''
4 其他
4.1 instance
判斷一個對象是否是一個已知的類型 isinstance(object, classinfo)
print(isinstance(1,int) )#True
print(isinstance(5.2,float)) #True
print(isinstance(True,bool)) #True
print(isinstance('5.2',str)) #True
注:
type() 不會認為子類是一種父類類型,不考慮繼承關系。
isinstance() 會認為子類是一種父類類型,考慮繼承關系。
4.2 end參數
【例子】每次輸出結束都用end設定的參數&結尾,并沒有預設換行。\
shoplist=['apple','mango','carrot','banana']
print("This is printed with 'end='&''.")
for item in shoplist:
print(item,end='&')
print('hello world')
#This is printed with 'end='&''.
#apple&mango&carrot&banana&hello world
【例子】item值與’anotherstring’兩個值之間用sep設定的參數&分割。由于end參數沒有設定,是以預設是輸出解釋後換行,即end參數的預設值為\n。
shoplist=['apple','mango','carrot','banana']
print("This is printed with 'sep='&''.")
for item in shoplist:
print(item,'anotherstring',sep='&')
#This is printed with 'sep='&''.
#apple&anotherstring
#mango&anotherstring
#carrot&anotherstring
#banana&anotherstring
5.練習題
1.怎樣對python中的代碼進行注釋?
在 Python 中,# 表示注釋,作用于整行。
‘’’ ‘’’ 或者 “”" “”" 表示區間注釋,在三引号之間的所有内容被注釋。
2.python有哪些運算符,這些運算符的優先級是怎樣的?
算術、比較、邏輯、位、三元運算符及其他運算符
運算符的優先級:
• 一進制運算符優于二進制運算符
• 先算術運算,後移位運算,最後位運算
• 邏輯運算最後結合
3.python 中 is, is not 與 ==, != 的差別是什麼?
is, is not 對比的是兩個變量的記憶體位址
==, != 對比的是兩個變量的值
比較的兩個變量,指向的都是位址不可變的類型(str等),那麼is,is not 和 ==,!= 是完全等價的。
對比的兩個變量,指向的是位址可變的類型(list,dict,tuple等),則兩者是有差別的。
4.python 中包含哪些資料類型?這些資料類型之間如何轉換?
基本類型:整型、浮點型、布爾型
容器類型:字元串、元組、清單、字典和集合
轉換為整型 int(x, base=10)
轉換為字元串 str(object=’’)
轉換為浮點型 float(x)
6.位運算
6.1 原碼、反碼和補碼
原碼:就是其二進制表示(注意,最高位是符号位)。
反碼:正數的反碼就是原碼,負數的反碼是符号位不變,其餘位取反。
00 00 00 11 -> 3
11 11 11 00 -> -3
補碼:正數的補碼就是原碼,負數的補碼是反碼+1。
00 00 00 11 -> 3
11 11 11 01 -> -3
6.2 按位取反~
~ 把num的補碼中的 0 和 1 全部取反(0 變為 1,1 變為 0)有符号整數的符号位在 ~ 運算中同樣會取反。
6.3 按位與操作 &
隻有兩個對應位都為 1 時才為 1
00 00 01 01 -> 5
&
00 00 01 10 -> 6
---
00 00 01 00 -> 4
6.4 按位或操作 |
隻要兩個對應位中有一個 1 時就為 1
6.5 按位異或操作 ^
隻有兩個對應位不同時才為 1
A: 00 00 11 00
B: 00 00 01 11
A^B: 00 00 10 11
B^A: 00 00 10 11
A^A: 00 00 00 00
A^0: 00 00 11 00
A^B^A: = A^A^B = B = 00 00 01 11
6.6 按位左移操作 <<
num << i 将num的二進制表示向左移動i位所得的值。
00 00 10 11 -> 11
11 << 3
---
01 01 10 00 -> 88
6.7 按位右移操作 >>
num >> i 将num的二進制表示向右移動i位所得的值。
通過 <<,>> 快速計算2的倍數問題。
通過 ^ 快速交換兩個整數。n << 1 -> 計算 n * 2
n >> 1 -> 計算 n / 2, 負奇數的預算不可用
n << m -> 計算 n * (2^m), 即乘以2的m次方
n >> m -> 計算 n / (2^m), 即除以2的m次方
1 << n -> 2^n
a ^= b
b ^= a
a ^= b
通過 a & (-a) 快速擷取a的最後為 1 位置的整數。
00 00 01 01 -> 5
&
11 11 10 11 -> -5
---
00 00 00 01 -> 1
00 00 11 10 -> 14
&
11 11 00 10 -> -14
---
00 00 00 10 -> 2
6.8 其他
集合之間的操作:a | (1 << i) -> 把i插入到集合中
a & ~(1<< i)-> 把i從集合中删除
a & (1<< i) -> 判斷i是否屬于該集合 (零不屬于, 非零屬于)
Python中bin一個負數(十進制表示),輸出的是它的原碼的二進制表示加上個負号,巨坑。
Python中的整型是補碼形式存儲的。
Python中整型是不限制長度的不會超範圍溢出。
是以為了獲得負數(十進制表示)的補碼,需要手動将其和十六進制數0xffffffff進行按位與操作,再交給bin()進行輸出,得到的才是負數的補碼表示。
print(bin(3)) # 0b11
print(bin(-3)) # -0b11
print(bin(-3 & 0xffffffff))
# 0b11111111111111111111111111111101
print(bin(0xfffffffd))
# 0b11111111111111111111111111111101
print(0xfffffffd) # 4294967293
7.練習題
leetcode 習題 136. 隻出現一次的數字
給定一個非空整數數組,除了某個元素隻出現一次以外,其餘每個元素均出現兩次。找出那個隻出現了一次的元素。
嘗試使用位運算解決此題。
"""
Input file
example1: [2,2,1]
example2: [4,1,2,1,2]
Output file
result1: 1
result2: 4
"""
class Solution:
def singleNumber(self, nums: List[int]) -> int:
# your code here
x = 0
for num in nums:
x = x ^ num
return x