3-變量和運算符

1.變量

1.1 定義變量

  • 語法:
    變量名 = 數(shù)據(jù)
  • 對于重復(fù)使用,并且經(jīng)常需要修改的數(shù)據(jù),可以定義為變量,來提高編程效率。
    定義變量的語法為: 變量名 = 變量值。(這里的 = 作用是賦值。)
    定義變量后可以使用變量名來訪問變量值。
  • 說明:所謂變量名,可以理解為箱子,當(dāng)需要使用變量值,就把對應(yīng)的箱子拿來。
    變量即是可以變化的量,可以隨時進(jìn)行修改。
    程序就是用來處理數(shù)據(jù)的,而變量就是用來存儲數(shù)據(jù)的
  • 說明:
    變量名 - 程序員自己命名
    要求:1)標(biāo)識符 2)不能是關(guān)鍵字
    規(guī)范:1)見名知義 2)滿足PEP8的命名規(guī)范(所有的字母都小寫,多個單詞之間用下劃線隔開)
    3)不使用系統(tǒng)提供的類型名、函數(shù)名和模塊名

= - 賦值符號,固定寫法
數(shù)據(jù) - 任何有結(jié)果的表達(dá)式,包括:獨立數(shù)據(jù)、運算表達(dá)式(除了賦值運算)、函數(shù)調(diào)用表達(dá)式

  1. 變量名
age = 18
teacher_name = '張三'
int_num = 20
# print = 100     # 錯誤寫法
# print('abc')
  1. 獨立數(shù)據(jù)
x = 19
x1 = 12.4
x2 = 0b11011
x3 = '你好'
x4 = True
  1. 運算表達(dá)式
y1 = 10 + 20

定義一個變量,保存學(xué)生的分?jǐn)?shù):90

stu_score = 90

1.2 使用變量

  • 變量中保存的數(shù)據(jù)能做什么,變量就能做什么
  • 使用變量的時候其實是在使用變量中保存的數(shù)據(jù)
# print('hello world!')
print(age)
print('age', age)    # age 18
# 變量中保存的數(shù)據(jù)能做什么,變量就能做什么
print(10 + 20)       # 30
print(age + 20)      # 38
# 變量中保存的數(shù)據(jù)能做什么,變量就能做什么
print('abc'[0])
str1 = 'hello word!'
print(str1[0])

1.3修改變量中的數(shù)據(jù)(重新給變量賦值)

# 變量 = 新值
print(age)
# 重新給變量age賦值為20
age = 20
print(age)    # 20
# python中同一個變量可以保存不同類型的值
age = '你好!'
print(age)   # 你好!

1.4 同時定義多個變量/同時給多個變量賦值

  1. 同時給不同的變量賦不同的值: 變量名1,變量名2,變量名3,...= 數(shù)據(jù)1,數(shù)據(jù)2,數(shù)據(jù)3,...
a, b, c = 10, 20, 30 
print(a, c, b)

# python交換兩個變量的值: 變量1, 變量2 = 變量2, 變量1
x = 100
y = 200
x, y = y, x    # x, y = 200, 100
print(x, y)

# 練習(xí):假設(shè)已經(jīng)存在三個變量x1, x2, x3 要求用一句代碼完成功能:x1 = x3, x2=x1, x3=x2
# x1=1, x2=2, x3=3 -> x1=3, x2=1, x3=2
x1, x2, x3 = 1, 2, 3
x1, x2, x3 = x3, x1, x2
print(x1, x2, x3)
  1. 同時給不同的變量賦相同的值:變量1 = 變量2 = 變量3 = ... = 數(shù)據(jù)
a1 = a2 = a3 = 100
print(a1, a2, a3)

# a1, a2, a3 = 1, 2, 3
# a1 = a2 = a3 = 10
# a1 = 1, a2 = 2 (錯誤)
# a1 = 1; a2 = 2
# 注意:沒有賦值過的變量不能使用
# print(stu_age)     #  NameError: name 'stu_age' is not defined
# stu_age = 10

2.變量賦值原理

2.1 定義變量和給變量賦值的原理:

變量 = 數(shù)據(jù)

  • 1)先在堆中申請內(nèi)存(申請多大看被被賦值的數(shù)據(jù)需要多大內(nèi)存)
  • 2)將數(shù)據(jù)保存在內(nèi)存區(qū)域中
  • 3)讓變量和保存數(shù)據(jù)的內(nèi)存進(jìn)行關(guān)聯(lián)(讓變量保存數(shù)據(jù)對應(yīng)的內(nèi)存地址)

2.2 id函數(shù)

id(變量) - 獲取變量中關(guān)聯(lián)的數(shù)據(jù)在內(nèi)存中的地址

num = 10
print(id(num))

num = 20
print(id(num))
a=10過程如下:
image
  • 注意:我們并不是為標(biāo)記a建立了一個值,而是先建立一個值以后,再用一個標(biāo)記去指向它
a = 10;b = a ; a = 20過程如下:
image

先是b也指向了a指向的地方,然后a指向了新的20,b所指還是10.

3.數(shù)學(xué)運算符

python支持的運算符:數(shù)學(xué)運算符、比較運算符、邏輯運算符、賦值運算符、位運算

數(shù)學(xué)運算符: +(加),-(減),(乘),/(除),%(取余、取模),//(整除),*(冪運算)

  1. +(加),-(減),*(乘),/(除) 和數(shù)學(xué)中的加減乘除功能一模一樣
print(5+2)
print(5-2)
print(5*2)
print(5/2)
  1. % - 求余數(shù)
# 數(shù)字1 % 數(shù)字2  -> 求數(shù)字1除以數(shù)字2的余數(shù)
print(5 % 2)

應(yīng)用1: 取整數(shù)的個位數(shù)或者低幾位數(shù)
練習(xí): 獲取變量 num 的個位數(shù)

num = 8679
print(num % 10)    # 9

print(num % 100)    # 79

應(yīng)用2:判斷一個數(shù)是否能夠被另外一個數(shù)整除
練習(xí):判斷num的是否是偶數(shù)

num = 2898
print(num % 2)
  1. // - 求商取商的整數(shù)部分(向下取整/向小取整)
print(5//2)    # 2
print(-5//2)   # -3
print(3.9//3)  # 1.0

應(yīng)用:取定長數(shù)字的最高位

num = 367
print(num // 100)    # 3
print(num // 10)     # 36
  1. **
    M ** N - 計算M的N次方
print(3 ** 2)   # 9
print(2 ** 3)   # 8
print(9 ** 0.5)   # 3.0
n = 1/3
print(8 ** n)   # 2.0

練習(xí):12 + 3 * 4 // 5 - 6 ** 2

# 12 + 12 // 5 - 36
# 12 + 2 - 36
# -22
print(12 + 3 * 4 // 5 - 6 ** 2)

4.比較運算符

比較運算符(關(guān)系運算符):>, <, ==, >=, <=, !=,<>
注意:

  1. 所有比較運算的結(jié)果都是布爾值

  2. 數(shù)字?jǐn)?shù)據(jù)不能和字符串?dāng)?shù)據(jù)進(jìn)行比較

  3. 如果是兩個字符串進(jìn)行比較,會將每個字符都轉(zhuǎn)換成對應(yīng)的編碼,然后逐一進(jìn)行對比,直到其中一個比完

  4. 數(shù)字和字符串做==運算結(jié)果是false,除了 == 以外的邏輯運算時,會直接報錯

print(10 > 5)    # True
print(10 < 5)    # False
print(10 <= 5)   # False
print(10 <= 10)  # True
print(10 == 10)  # True
print(10 != 5)   # True
print(10 != 10)  # False

a = 3 > 4
print(a)

b = 5 % 2
print(b)

python中支持比較運算符的連寫來表示范圍

x = 10
print(0 <= x <= 100)    # True

5.邏輯運算符

python中的邏輯運算符:and(邏輯與)、or(邏輯或)、not(邏輯非) 優(yōu)先級:not > and >or

5.1 and

  1. 運算規(guī)則:
    操作對象都是布爾值:兩個都是True結(jié)果才是True,只要有一個是False結(jié)果就是False
"""
True and True  -> True
True and False -> False
False and True -> False
False and False -> False
"""
  1. 應(yīng)用場景:希望兩個或者多個條件同時滿足才做什么事情,就使用邏輯與運算。相當(dāng)于生活中的并且
    練習(xí)1:寫出學(xué)生是否能拿獎學(xué)金的條件,拿獎學(xué)金的要求:績點超過4,操評分高于85,這個兩個條件同時滿足
grade = 4.5
score = 80
# result = grade > 4 and score > 85
# print(result)
print('是否能拿獎學(xué)金:', grade > 4 and score > 85)

5.2 or

  1. 運算規(guī)則
    操作對象都是布爾值: 兩個都是False結(jié)果才是False,只要有一個是True結(jié)果就是True
"""
True or True  -> True
True or False -> True
False or True -> True
False or False -> False
"""
  1. 應(yīng)用場景:希望兩個或者多個條件只要有一個滿足就可以就使用邏輯或運算。相當(dāng)于生活中的或者
    練習(xí)2:寫出學(xué)生是否能拿獎學(xué)金的條件,拿獎學(xué)金的要求:績點超過4或者操評分高于90
grade = 4.5
score = 80

練習(xí)3:寫出判斷指定的年是否是閏年的條件: 1)能被4整除但是不能被100整除 2)直接能被400整除

year = 2012
d1 = year % 4 == 0    # 能被4整除的條件
d2 = year % 100 != 0  # 不能被100整除的條件
d3 = year % 400 == 0  # 能被400整除的條件
print('是否是閏年:', (d1 and d2) or d3)
print('是否是閏年:', year % 4 == 0 and year % 100 != 0 or year % 400 == 0)

5.3 not

  1. 運算規(guī)則:True 變 False , False 變 True
"""
not True  -> False
not False -> True
"""
  1. 應(yīng)用場景:不滿足某個條件就做什么,就用not。
age = 18
print('是否成年:', age >= 18)
print('是否成年:', not age < 18)

練習(xí):寫出num是否不能同時被3和7整除

num = int(input('請輸入一個數(shù):'))
print('是否滿足條件:', not (num % 3 == 0 and num % 7 == 0))

5.4 操作對象不是布爾的時候

邏輯運算符語法上可以操作任何數(shù)據(jù)

  1. 數(shù)據(jù)1 and 數(shù)據(jù)2 -> 如果數(shù)據(jù)1的布爾值是True,結(jié)果是數(shù)據(jù)2;
    如果數(shù)據(jù)1的布爾值是False, 結(jié)果就是數(shù)據(jù)1

  2. 數(shù)據(jù)1 or 數(shù)據(jù)2 -> 如果數(shù)據(jù)1的布爾值是True,結(jié)果是數(shù)據(jù)1;
    如果數(shù)據(jù)1的布爾值是False,結(jié)果是數(shù)據(jù)2
    補充: 數(shù)據(jù)的布爾值怎么確定 - 所有為零為空的值都是False,其他數(shù)據(jù)的布爾都是True

print(1 and 'abc')      # 'abc'
print('abc' and 'hello')    # 'hello'
print(0 and 'abc')      # 0
print(False and 100)    # False
print('' and 'abc')   # ''

print(1 or 'abc')    # 1
print(7 or 8)        # 7
print(0 or 'abc')    # 'abc'

print(not 1)     # False
print(not 0)     # True

5.5 短路操作

and 的短路操作:
表達(dá)式1 and 表達(dá)式2 -> 如果表達(dá)式1的結(jié)果是False, 表達(dá)式2不會執(zhí)行

or 的短路操作:
表達(dá)式1 or 表達(dá)式2 -> 如果表達(dá)式1的結(jié)果是True, 表達(dá)式2不會執(zhí)行

  • 邏輯與運算的規(guī)則:只有所有的運算數(shù)都是True,結(jié)果才是True;只要有一個運算數(shù)是False,結(jié)果就是False-
  • 邏輯或運算的規(guī)則:只有所有的運算數(shù)都是False,結(jié)果才是False;只要有一個運算數(shù)是True,結(jié)果就是True
  • 邏輯運算的取值使用:邏輯運算的結(jié)果,不一定是布爾值
  • 邏輯與運算只要遇到False,就停止了。
  • 邏輯與運算做取值時,取第一個為False的值;如果所有的運算數(shù)都是True,取最后一個值
  • 邏輯或運算只要遇到True,就停止了。
  • 邏輯或運算做取值時,取第一個為True的值;如果所有的運算數(shù)都是False,取最后一個值
def func1():
    print('函數(shù)被執(zhí)行')

False or func1()

6.賦值運算符

6.1 賦值運算符:=、+=、-=、=、/=、%=、//=、*=

  1. 所有的賦值運算都是用來給變量賦值的
  2. 所有的賦值運算符的左邊都必須是變量,復(fù)合賦值運算符左邊的變量必須是已經(jīng)賦值過的變量
  3. 所有賦值運算符的右邊都可以是任意有結(jié)果的表達(dá)式

1).=

a = 10
age = 18
a = 100

2).+=、-=、=、/=、%=、//=、*=
變量 += 數(shù)據(jù) -> 變量 = 變量 + 數(shù)據(jù)

a += 20    # a = a + 20 -> a = 100 + 20 -> a = 120
print(a)   # 120

a /= 4     # a = a / 4 -> a = 120 / 4
print(a)   # 30.0

a **= 2
print(a)   # 900

6.2 運算符的優(yōu)先級

數(shù)學(xué)運算符 > 比較運算符 > 邏輯運算符 > 賦值運算符(最低)
** > *,/,%,// > +, -
有括號先算括號里面的

a = 10 + 30 > 35
a = 30 * 2 > 50 * 2
print(a)

7.位運算符

  1. 位運算的特點:效率高、內(nèi)存消耗少
  2. 位運算運算符: &(按位與)、|(按位或)、^(異或)、~(按位取反)、>>(右移)、<<(左移)
    所有的位運算都是直接操作數(shù)據(jù)在內(nèi)存中存儲的補碼

說明:

? 與(&),按位與運算符:參與運算的兩個值,如果兩個相應(yīng)位都為1,則該位的結(jié)果為1,否則為0

? 或(|),按位或運算符:只要對應(yīng)的兩個二進(jìn)位有一個為1時,結(jié)果位就為1

? 異或(^),按位異或運算符:當(dāng)兩對應(yīng)的二進(jìn)位相異時,結(jié)果為1,即不同為1,反之相同為0

? 取反(~),按位取反運算符:對數(shù)據(jù)的每個二進(jìn)制位取反,即把1變?yōu)?,把0變?yōu)?

? 左位移(<<),運算數(shù)的各二進(jìn)位全部左移若干位,由<<右邊的數(shù)字指定了移動的位數(shù),高位丟棄,低位補0

? 右位移(>>),把‘>>’左邊的運算數(shù)的各二進(jìn)制位全部右移若干位,>>右邊的數(shù)字指定了移動的位數(shù)

  • &(按位與)
    數(shù)字1 & 數(shù)字2 - 兩個都是1結(jié)果就是1,否則結(jié)果0
    01101101(補) & 10101100(補) -> 00101100(補)
    特點:某一位上的數(shù)和1與可以對這一位上的數(shù)進(jìn)行保存,和0與會對這一位進(jìn)行置0操作
print(5 & 9)
"""
5: 00000101
9: 00001001
5 & 9 = 00000001(補) = 1

-5:10000101(原) - 11111011(補)
-9:10001001(原) - 11110111(補)
-5 & -9  = 11110011(補) - 11110010(反) - 10001101(原) - -13
"""
print(-5 & -9)    # -13

應(yīng)用:判斷數(shù)字的奇偶性
"""
讓被判斷的數(shù)字和 1 進(jìn)行按位與運算,結(jié)果如果是0說明是偶數(shù)否則是奇數(shù)
"""

print(-35 & 1)
  • |(按位或)
    數(shù)字1 | 數(shù)字2 - 只要有一個是1結(jié)果就是1,兩個都是0結(jié)果才是0
    練習(xí):7 | -16

  • ^(異或)
    數(shù)字1 ^ 數(shù)字2 - 不同為1,相同為0

print(18 ^ 9)   # 27
print(27 ^ 9)   # 18
  • ~ - 0變1,1變0
    ~ 數(shù)字

  • >>,<<
    數(shù)字1 >> 數(shù)字2 - 數(shù)字1 // 2**數(shù)字2
    數(shù)字1 << 數(shù)字2 - 數(shù)字 * 2**數(shù)字2
    應(yīng)用:高效率、快速的乘2或者2的次方數(shù)

print(6 << 1)   # 6 * 2**1
print(5 << 2)   # 5 * 2**2
print(6 >> 1)   # 6 // 2**1
print(7 >> 1)   # 7 // 2**1
print(-7 >> 1)  # -7 // 2**1

age = 18
age *= 2
age = age << 1
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容