天天看點

Python小白打基礎(一)變量、運算符與資料類型6.位運算7.練習題

Python基礎

  • 變量、運算符與資料類型
    • 1.變量
    • 2.運算符
    • 3.注釋
    • 4 其他
        • 4.1 instance
        • 4.2 end參數
    • 5.練習題
  • 6.位運算
  • 7.練習題

變量、運算符與資料類型

1.變量

變量是存儲在記憶體中的值。在建立變量時會在記憶體中開辟一個空間。基于變量的資料類型,解釋器會配置設定指定記憶體,并決定什麼資料可以被存儲在記憶體中。是以,變量可以指定不同的資料類型,這些變量可以存儲整數,小數或字元。

  1. 變量的指派:每個變量在使用前都必須指派,變量指派以後該變量才會被建立。等号(=)用來給變量指派。
  2. 标準資料類型:

    (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 比較運算符:

Python小白打基礎(一)變量、運算符與資料類型6.位運算7.練習題

2.3 指派運算符:

Python小白打基礎(一)變量、運算符與資料類型6.位運算7.練習題

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 邏輯運算符:

Python小白打基礎(一)變量、運算符與資料類型6.位運算7.練習題

2.6 成員運算符:

Python小白打基礎(一)變量、運算符與資料類型6.位運算7.練習題

2.7 身份運算符:

Python小白打基礎(一)變量、運算符與資料類型6.位運算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)。

Python小白打基礎(一)變量、運算符與資料類型6.位運算7.練習題

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
           
上一篇: Brep