Lesson_3
【5】位運算符
位運算符:按位運算符是把數(shù)字看做二進制數(shù)來進行計算
& 按位與運算符
相應的位數(shù)都為1,則該位的結果是1统求,否則為0
print(5 & 7)
'''
5 ->101
7 ->111
101
111
————
101
101->5
'''
>>>5
| 按位或運算符
兩個二進制位有一個位1時检碗,結果為1
print(5 | 7)
'''
101
111
---
111
'''
>>>7
^ 按位異或運算符
二進制的兩位相異時,結果為1
print(5 ^ 7)
'''
101
111
---
010
'''
>>>2
~ 按位翻轉運算符
將二進制數(shù)+1之后乘以-1
print(~5)
'''
~101
___
(101+1) * -1
___
(0110) * -1
___
-0110
>>>-6
<< 左移動運算符
各二進制位全部左移動若干位码邻,由<<右側的數(shù)字決定后裸,高位丟棄,低位補0
方法: X<<N 將一個數(shù)字X所對應的二進制數(shù)向左移動N位.
print(2 << 2)
'''
0010
___
1000
'''
>>>8
>> 右移動運算符
各二進制位全部右移動若干位冒滩,由>>右側的數(shù)字決定
方法: X>>N 將一個數(shù)字X所對應的二進制數(shù)向右移動N位.
print(8 << 2)
'''
1000
___
0010
'''
>>>2
【6】比較運算符
比較運算符根據(jù)表達式值得真假返回布爾值微驶。
格式: 表達式1 關系運算符 表達式2
== != > < >= <=
python在布爾值處理上有些不同,True等于整數(shù)1开睡,F(xiàn)alse等于整數(shù)0
#全等于因苹,包括數(shù)據(jù)類型,布爾型的
print(1 == 2) >>>False
print(1 == '1') >>>False
print(1 == True) >>>True
#不等于
print(1 != 2) >>>True
print(0 != False) >>>False
print(1 != '1') >>>True
#大于
print(1 > 2) >>>False
print(True > False) >>>True
#小于
print(3 < 8) >>>True
print(True < False) >>>False
#大于等于
print(True >= False) >>>True
print(1 >= True) >>>True
#小于等于
print(3.14 <= 3.14) >>>Ture
print(math.ceil(math.pi) <= math.floor(math.pi)) >>>False
邏輯運算符
邏輯操作符包括and
、or
篇恒、not
邏輯與:and操作符左邊的操作符為真扶檐,右邊也為真,那么結果為真胁艰。
and執(zhí)行的是一個串聯(lián)的短路原則款筑,一個地方壞了都換了(悲觀原則)
a = 0
b = 1
print(a==0 and b==1)
print(a==0 and b==2)
>>>True
>>>False
邏輯與:or操作符只需要左邊或右邊有一個為真,那么結果為真腾么。
or是一個并聯(lián)的原則奈梳,其它的短路了我這里依然是好的于宙,只要一個是好的那就是好的(樂觀原則)
a = 0
b = 1
print(a==2 and b==12)
print(a==0 or b==2)
>>>False
>>>True
邏輯非:not操作符是一個一元操作符旺上,它的作用是得到一個和操作符相反的布爾類型。
a = 0
print(not a==1)
print(not a==0)
#這里相當于 !=
>>>True
>>>False
【7】成員運算符
成員運算符包括in
锅睛、not in
,從字義上可以看,他是判斷在什么里面和不在什么里面铜邮,返回一個布爾值运褪。
格式: x in y x not in y
a = 'qwert'
print('e' in a)
print('e' not in a)
>>>True
>>>False
【8】身份運算符
身份運算符包括is
、is not
劣欢,判斷標識符是不是引用同一個對象棕诵。
格式: x is y x is not y
a = None
b = 333
c = 233
print(a is None)
print(b is not None)
print(c is 233)
>>>True
>>>True
>>>True
第六章
【1】字符串
到目前為止,我們所認知的在字符串就是引號內(nèi)的一切東西凿将,我們把字符串叫做文本校套,文本和數(shù)字是截然不同。
python創(chuàng)建字符串的時候牧抵,必須要加上引號笛匙,單引號也可以雙引號也可以犀变,python一點也不挑膳算,
但是你不能一邊用單引號,一邊用雙引號弛作,這樣語法就會報錯了涕蜂。
print('python")
>>>SyntaxError: EOL while scanning string literal
我們以前提到過拼接,兩個數(shù)字叫相加映琳,兩個字符串相加叫拼接机隙。
print('5' + '8')
>>>58
那如果在字符串內(nèi)容中需要用到單引號怎么辦了?
print('Let's go')
>>>SyntaxError: invalid syntax
有一種方法萨西,只要用上不同的引號有鹿,python就不會誤解你的意思了
print("Let's go")
>>>Let's go
【2】原始字符串
反斜杠是一個好東西,但是我們試一試C:\now
print('C:\now')
>>>C:
>>>ow
#因為 \n 在計算機里是 回車鍵
那如何才能正常的去打踊迅葱跋?
print('C:\\now')
>>>C:\now
# 反斜杠(\)代表轉義的意思
但是如果一個路徑里面有很多的\那我么一個一個的輸入就不樂意了,這時候我們就可以使用 原始字符串 了,
只需要在字符串前面加一個英文字母r即可:
string = r'C:\now\start'
print(string)
>>>C:\now\start
使用字符串的時候需要注意一點:無論是否是原始字符串源梭,都不能以反斜杠結尾娱俺。(反斜杠放在字母的結尾表示還沒有結束,換行繼續(xù)的意思)
如果你繼續(xù)操作就會報錯:
string = r'C:\now\start\'
print(string)
>>>SyntaxError: EOL while scanning string literal
【3】長字符串
如果你希望得到一個跨多行的字符串废麻,例如:
從明天起, 做一個幸福的人
喂馬, 劈柴, 周游世界
從明天起, 關心糧食和蔬菜
我有一所房子, 面朝大海, 春暖花開
從明天起, 和每一個親人通信
告訴他們我的幸福
那幸福的閃電告訴我的
我將告訴每一個人
給每一條河每一座山取一個溫暖的名字
陌生人, 我也為你祝福
愿你有一個燦爛的前程
愿你有情人終成眷屬
愿你在塵世獲得幸福
而我只愿面朝大海, 春暖花開
這是一首好詩荠卷,但是如果要打印出來,那就需要用到很多的換行符:
print("從明天起, 做一個幸福的人\n喂馬, 劈柴, 周游世界\n從明天起, 關心糧食和蔬菜\n我有一所房子, 面朝大海, 春暖花開\n\n從明天起, 和每一個親人通信\n告訴他們我的幸福\n那幸福的閃電告訴我的\n我將告訴每一個人\n\n給每一條河每一座山取一個溫暖的名字\n陌生人, 我也為你祝福\n愿你有一個燦爛的前程\n愿你有情人終成眷屬\n愿你在塵世獲得幸福\n而我只愿面朝大海, 春暖花開")
這樣會給我們帶來很多困擾烛愧,好在python里面有長字符串油宜,只需要三個引號包裹起來掂碱,不管是三個單引號還是雙引號。
print('''
從明天起, 做一個幸福的人
喂馬, 劈柴, 周游世界
從明天起, 關心糧食和蔬菜
我有一所房子, 面朝大海, 春暖花開
從明天起, 和每一個親人通信
告訴他們我的幸福
那幸福的閃電告訴我的
我將告訴每一個人
給每一條河每一座山取一個溫暖的名字
陌生人, 我也為你祝福
愿你有一個燦爛的前程
愿你有情人終成眷屬
愿你在塵世獲得幸福
而我只愿面朝大海, 春暖花開
''')
【4】字符串運算
字符串拼接
str1 = '你好'
str2 = '世界'
str3 = str1 + str2
print(str3)
>>>你好世界
重復字符串
str1 = '你好'
str2 = '世界'
str3 = str1 + str2
print(str3 * 3 )
>>>你好世界
>>>你好世界
>>>你好世界
訪問字符串中的某一個字符
通過索引下標查找字符慎冤,索引從0開始
str1 = 'hello word,hello shanghai'
print(str1[1])
print(str1[-1])
>>>e
>>>i
字符串的不可變性質
str1 = 'hello word,hello shanghai'
str1[1] = 'a'
print(str1)
>>>TypeError: 'str' object does not support item assignment
返回截取字符串中的一部分
語法 str[start:length:skip]
start表示從下表幾開始疼燥,length表示截取長度,skip表示隔幾位截取一次
str1 = 'hello word,hello shanghai'
print(str1[0:7]) #從0開始取7個
print(str1[0::2]) #從0開始取全部蚁堤,隔2個取一次
print(str1[::3]) #默認從0開始醉者,隔3個取一次
print(str1[-10::2]) #從倒數(shù)第10個開始,隔2個取一次违寿,如果是倒取得話湃交,不能取指定長度
>>>hello w
>>>hlowr,el hnhi
>>>hlwdeohgi
>>>osaga
返回翻轉字符串結果
str1 = 'hello word,hello shanghai'
print(str1[::-1])
>>>iahgnahs olleh,drow olleh
#翻轉以后不影響原來的str1內(nèi)存中的值,而是使用一次以后就被回收了
返回去除的空格結果
str1 = ' aleX '
print(str1.lstrip()) #left strip 去除左邊的空格
print(str1.rstrip()) #right strip 去除右邊的空格
print(str1.strip()) #strip 去除兩邊的空格
判斷是不是以什么開頭
str1 = 'abcde'
print(str1.startswith('ab')) #結果正確返回布爾值
>>>True
判斷以什么結尾
str1 = 'abcde'
print(str1.endswith('de')) #結果正確返回布爾值
>>>True
>>>True
返回替換字符
語法:str. replace(i,j,k)
i代表被替換字符藤巢,j代表準備替換的字符搞莺,k代表替換的次數(shù),替換的方向是自左向右去查找
str1 = 'abcdeabcd'
print(str1.replace('a','A'))
print(str1)
>>>AbcdeAbcd
>>>abcdeabcd
#默認替換所有的
str1 = 'abcdeabcd'
print(str1.replace('a','A'掂咒,1))
print(str1)
>>>Abcdeabcd
>>>abcdeabcd
#替換了一次
返回分割字符
語法:str.split(i,k)
i代以什么為分割符的才沧,k代表分割次數(shù),分割自左向右運行,返回一個列表(類型)
后面會學習到,被設定為分隔符的字符不會出出現(xiàn)在列表中绍刮。
str1 = 'abcdeabcd'
print(str1.split('d'))
>>>['abc', 'eabc', '']
#默認全部分割
str1 = 'abcdeabcd'
print(str1.split('d'温圆,1))
>>>['abc', 'eabcd']
#添加第二個參數(shù),分割一次
返回全大寫
str1 = 'abcdeabcd'
print(str1.upper())
>>>ABCDEABCD
返回全小寫
str1 = 'ABCDEABCD'
print(str1.lower())
>>> abcdeabcd
返回首字母大寫
str1 = 'abcdabcd'
print(str1.capitalize())
>>>Abcdabcd
str1 = 'ABCDABCD'
print(str1.title())
>>> Abcdabcd
str1 = 'abcdabcd'
print(str1[0].upper()+str1[1:])
>>> Abcdabcd
返回首字母小寫
str1 = 'ABCDABCD'
print(str1[0].lower()+str1[1:])
>>>aBCDABCD
判斷是否是全大寫
返回布爾值,如果是空字符串返回False
str1 = 'ABCDABCD'
print(str1.isupper())
>>>Ture
判斷是否是全小寫
返回布爾值,如果是空字符串返回False
str1 = 'abcdabcd'
print(str1.islower())
>>>Ture
判斷首字母大寫
返回布爾值,如果是空字符串返回False
但是python沒有給我們提供iscapitalize()的方法
str1 = 'Abcdabcd'
print(str1.istitle())
>>>Ture
返回以什么分割的字符
語法:'i'.jion(j)
i代表分割的符號孩革,j代表被分割的字符
str1 = 'abcdabcd'
print(','.join(str1))
>>>a,b,c,d,a,b,c,d
#以逗號分割
【5】占位符
為什么需要占位符岁歉,因為變量在引號里面會被看成一個字符串,那么python就不會解析膝蜈。
語法格式:
'字符串 %s' % 變量或'字符'
'字符串%s %d %f'%(變量1锅移,變量2,變量3)
python的占位符包括:
%s #代表str
%d #代表int
$f #代表float
打印字符串
num = 'Tom'
print ("His name is %s"%num)
>>>His name is Tom
#如果變量里面是個數(shù)字那么使用了%s也會解析成字符
打印整數(shù)
num = 2
print ("1 +1 = %d"%num)
>>>1 +1 = 2
#如果變量里面是個字符串那么使用了%d會 報類型錯
打印浮點數(shù)
num = 2.5
print ("1.5 +1 = %f"%num)
>>>1.5 +1 = 2.500000
#如果變量里面是個字符串那么使用了%f會 報類型錯,如果是整數(shù)會自動轉換成浮點數(shù)
打印浮點數(shù)(指定保留小數(shù)點位數(shù))
語法:'字符串 %1.1f' % 變量
num = 2.5
num1 = 16.5
print ("1.5 +1 = %.1f"%num)
print ("15.5 +1 = %0.2f"%num1)
>>>1.5 +1 = 2.5
>>>15.5 +1 = 16.50
#如果是整數(shù)相加饱搏,并且使用%.0f非剃,那么會四舍五入
#雙進度的不會影響整數(shù)部分
<font color='red'>注意:</font>
python 在四舍五入的時候會出現(xiàn)奇怪的問題,0.5問題,整數(shù)部分為偶數(shù)推沸,0.5則被舍去备绽,整數(shù)部分為奇數(shù),0.5則進1鬓催,這只是單精度的浮點數(shù)問題肺素。
num1 = 1.5
num2 = 2.5
num3 = 3.5
num4 = 4.5
print ("0.5 +1 = %.0f"%num1)
print ("1.5 +1 = %.0f"%num2)
print ("2.5 +1 = %.0f"%num3)
print ("3.5 +1 = %.0f"%num3)
>>>0.5 +1 = 2
>>>1.5 +1 = 2
>>>2.5 +1 = 4
>>>3.5 +1 = 4
雙進度的浮點數(shù)問題(了解)
雙進度的浮點問題和但進度不一樣
python的 BigDecimal.ROUND_HALF_UP與ROUND_HALF_DOWN機制(了解)
由于 python3 包括python2.7 以后的round策略使用的是decimal.ROUND_HALF_EVEN
即Round to nearest with ties going to nearest even integer. 也就是只有在整數(shù)部分是奇數(shù)的時候, 小數(shù)部分才逢5進1深浮; 偶數(shù)時逢5舍去压怠。 這有利于更好地保證數(shù)據(jù)的精確性, 并在實驗數(shù)據(jù)處理中廣為使用飞苇。
但如果一定要decimal.ROUND_05UP 即Round away from zero if last digit after rounding towards zero would have been 0 or 5; otherwise round towards zero. 也就是逢5必進1需要設置float為decimal.Decimal, 然后修改decimal的上下文
import decimal
context=decimal.getcontext() # 獲取decimal現(xiàn)在的上下文
context.rounding = decimal.ROUND_05UP
print(round(decimal.Decimal(2.55), 1)) # 2.6
print(format(decimal.Decimal(2.55), '.1f')) #'2.6'
print ("3.5 +1 = %.0f"%decimal.Decimal(2.55)) #3
指定占位符寬度
print ("Name:%10s Age:%8d Height:%8.2f"%("Aviad",25,1.83))
指定占位符寬度(左對齊)
左對齊就是在%后面加-
print ("Name:%-10s Age:%-8d Height:%-8.2f"%("Aviad",25,1.83))
指定占位符(只能用0當占位符)
如果堅持用其它的字符或數(shù)字作占位符菌瘫,那么輸出的時候為空
print ("Name:%-10s Age:%08d Height:%08.2f"%("Aviad",25,1.83))
科學計數(shù)法(以前提過)
format(0.0015,'.2e')
條件分支
大家在前面的學習已經(jīng)接觸過if-else了,它就是一個條件分支布卡。
比如在網(wǎng)絡游戲中雨让,打在在NPC領取任務鲸伴,在領取任務的時候都會給你幾個選擇或者是退出岸霹,那它是怎么實現(xiàn)的了,就是通過條件分支
我們先來個小游戲
規(guī)則:給你一個隨機數(shù)字设凹,你猜到就夸你一句贸街,你猜錯了諷刺就你一句庵寞;
#首先我們引入隨機庫
from random import randint
ran = randint(1,100)
guess = int(input("你猜猜我有幾根手指:")) #用戶輸入的數(shù)字傳遞進來以后默認是字符串,所以要轉成int
if guess == ran:
print("Y*^_^*Y 哇你猜對了 給你一個??")
else:
print("你可真笨??")
while循環(huán)
循環(huán)對于一般人是很難理解的薛匪。比如游戲捐川,超級瑪麗,當你掛了逸尖,游戲會重新開始古沥,而且規(guī)定了你有幾次從新開始的機會,這就是while循環(huán)娇跟。
但是這次你要是猜不對就要一直猜
但是我們要給點提醒
while結合if-else小案例
res = 1234567
guess = int(input('猜一下中獎號碼:'))
while guess != res:
guess = int(input('不對不對岩齿,再猜,再猜:'))
if guess == res:
print("Y*^_^*Y 哇你猜對了 ")
print('不過毛都沒有!')
else:
print('在用兩塊錢試試')
print("(*@ο@*) 哇~這么厲害一次就猜對了0m锷颉!")
不過else還可以和while配合使用:
count = 0
while count < 5:
print(count, " 小于5")
count = count + 1
else:
print (count, " 不小于5 ")
#在條件不滿足時觸發(fā)else
str = r'C:\Program Files\FishC\Good'
如果非要在原始字符串結尾輸入反斜杠吃谣,如何可以靈活處理乞封?
str1 = r'C:\Program Files\FishC\Good'"\\"
print(str1)