二進(jìn)制
二進(jìn)制是計(jì)算技術(shù)中廣泛采用的一種數(shù)制。二進(jìn)制數(shù)據(jù)是用0和1兩個(gè)數(shù)碼來(lái)表示的數(shù)。它的基數(shù)為2,進(jìn)位規(guī)則是“逢二進(jìn)一”,借位規(guī)則是“借一當(dāng)二”,由18世紀(jì)德國(guó)數(shù)理哲學(xué)大師萊布尼茲發(fā)現(xiàn)。當(dāng)前的計(jì)算機(jī)系統(tǒng)使用的基本上是二進(jìn)制系統(tǒng),數(shù)據(jù)在計(jì)算機(jī)中主要是以補(bǔ)碼的形式存儲(chǔ)的。計(jì)算機(jī)中的二進(jìn)制則是一個(gè)非常微小的開(kāi)關(guān),用“開(kāi)”來(lái)表示1,“關(guān)”來(lái)表示0。
常用進(jìn)制轉(zhuǎn)換的實(shí)現(xiàn)
十進(jìn)制到二進(jìn)制:
def dec2bin(num):
l = []
if num < 0:
return '-' + dec2bin(abs(num))
while True:
num, remainder = divmod(num, 2)
l.append(str(remainder))
if num == 0:
return ''.join(l[::-1])
十進(jìn)制到八進(jìn)制:
def dec2oct(num):
l = []
if num < 0:
return '-' + dec2oct(abs(num))
while True:
num, remainder = divmod(num, 8)
l.append(str(remainder))
if num == 0:
return ''.join(l[::-1])
十進(jìn)制到十六進(jìn)制:
base = [str(x) for x in range(10)] + [ chr(x) for x in range(ord('A'),ord('A')+6)]
def dec2hex(num):
l = []
if num < 0:
return '-' + dec2hex(abs(num))
while True:
num,rem = divmod(num, 16)
l.append(base[rem])
if num == 0:
return ''.join(l[::-1])
ASCII碼
在計(jì)算機(jī)中,所有的數(shù)據(jù)在存儲(chǔ)和運(yùn)算時(shí)都要使用二進(jìn)制數(shù)表示(因?yàn)橛?jì)算機(jī)用高電平和低電平分別表示1和0),例如,像a、b、c、d這樣的52個(gè)字母(包括大寫)、以及0、1等數(shù)字還有一些常用的符號(hào)(例如*、#、@等)在計(jì)算機(jī)中存儲(chǔ)時(shí)也要使用二進(jìn)制數(shù)來(lái)表示,而具體用哪些二進(jìn)制數(shù)字表示哪個(gè)符號(hào),當(dāng)然每個(gè)人都可以約定自己的一套(這就叫編碼),而大家如果要想互相通信而不造成混亂,那么大家就必須使用相同的編碼規(guī)則,于是美國(guó)有關(guān)的標(biāo)準(zhǔn)化組織就出臺(tái)了ASCII編碼,統(tǒng)一規(guī)定了上述常用符號(hào)用哪些二進(jìn)制數(shù)來(lái)表示。
美國(guó)標(biāo)準(zhǔn)信息交換代碼是由美國(guó)國(guó)家標(biāo)準(zhǔn)學(xué)會(huì)(American National Standard Institute , ANSI )制定的,標(biāo)準(zhǔn)的單字節(jié)字符編碼方案,用于基于文本的數(shù)據(jù)。起始于50年代后期,在1967年定案。它最初是美國(guó)國(guó)家標(biāo)準(zhǔn),供不同計(jì)算機(jī)在相互通信時(shí)用作共同遵守的西文字符編碼標(biāo)準(zhǔn),它已被國(guó)際標(biāo)準(zhǔn)化組織(International Organization for Standardization, ISO)定為國(guó)際標(biāo)準(zhǔn),稱為ISO 646標(biāo)準(zhǔn)。適用于所有拉丁文字字母。
以下代碼用于實(shí)現(xiàn)ASCII碼與字符相互轉(zhuǎn)換:
# 用戶輸入字符
c = input("請(qǐng)輸入一個(gè)字符: ")
# 用戶輸入ASCII碼,并將輸入的數(shù)字轉(zhuǎn)為整型
a = int(input("請(qǐng)輸入一個(gè)ASCII碼: "))
print( c + " 的ASCII 碼為", ord(c))
print( a , " 對(duì)應(yīng)的字符為", chr(a))
執(zhí)行以上代碼輸出結(jié)果為:
python3 test.py
請(qǐng)輸入一個(gè)字符: a
請(qǐng)輸入一個(gè)ASCII碼: 101
a 的ASCII 碼為 97
101 對(duì)應(yīng)的字符為 e
深淺copy
python中的深拷貝和淺拷貝和java里面的概念是一樣的,所謂淺拷貝就是對(duì)引用的拷貝,所謂深拷貝就是對(duì)對(duì)象的資源的拷貝。
首先,對(duì)賦值操作我們要有以下認(rèn)識(shí):
賦值是將一個(gè)對(duì)象的地址賦值給一個(gè)變量,讓變量指向該地址( 舊瓶裝舊酒 )。
修改不可變對(duì)象(str、tuple)需要開(kāi)辟新的空間
修改可變對(duì)象(list等)不需要開(kāi)辟新的空間
淺拷貝僅僅復(fù)制了容器中元素的地址
a=['hello',[1,2,3]]
b=a[:]
[id(x) for x in a]
[55792504, 6444104]
[id(x) for x in b]
[55792504, 6444104]
a[0]='world'
a[1].append(4)
print(a)
['world', [1, 2, 3, 4]]
print(b)
['hello', [1, 2, 3, 4]]
這里可以看出,未修改前,a和b中元素的地址都是相同的,不可變的hello
和可變的list地址都一樣,說(shuō)明淺拷貝知識(shí)將容器內(nèi)的元素的地址復(fù)制了一份。這可以通過(guò)修改后,b中字符串沒(méi)改變,但是list元素隨著a相應(yīng)改變得到驗(yàn)證。
淺拷貝是在另一塊地址中創(chuàng)建一個(gè)新的變量或容器,但是容器內(nèi)的元素的地址均是源對(duì)象的元素的地址的拷貝。也就是說(shuō)新的容器中指向了舊的元素( 新瓶裝舊酒 )。
深拷貝,完全拷貝了一個(gè)副本,容器內(nèi)部元素地址都不一樣
from copy import deepcopy
a=['hello',[1,2,3]]
b=deepcopy(a)
[id(x) for x in a]
[55792504, 55645000]
[id(x) for x in b]
[55792504, 58338824]
a[0]='world'
a[1].append(4)
print(a)
['world', [1, 2, 3, 4]]
print(b)
['hello', [1, 2, 3]]
這里可以看出,深拷貝后,a和b的地址以及a和b中的元素地址均不同,這是完全拷貝的一個(gè)副本,修改a后,發(fā)現(xiàn)b沒(méi)有發(fā)生任何改變,因?yàn)閎是一個(gè)完全的副本,元素地址與a均不同,a修改不影響b。
深拷貝是在另一塊地址中創(chuàng)建一個(gè)新的變量或容器,同時(shí)容器內(nèi)的元素的地址也是新開(kāi)辟的,僅僅是值相同而已,是完全的副本。
轉(zhuǎn)自:http://www.lxweimin.com/p/efa9dd51f5cc
字符串
字符串是 Python 中最常用的數(shù)據(jù)類型。我們可以使用引號(hào)('或")來(lái)創(chuàng)建字符串。
創(chuàng)建字符串很簡(jiǎn)單,只要為變量分配一個(gè)值即可。例如:
var1 = 'Hello World!'
## Python 訪問(wèn)字符串中的值
Python 不支持單字符類型,單字符在 Python 中也是作為一個(gè)字符串使用。
Python 訪問(wèn)子字符串,可以使用方括號(hào)來(lái)截取字符串,如下實(shí)例:
## 實(shí)例(Python 3.0+)
#!/usr/bin/python3
var1 = 'Hello World!'
var2 = "Runoob"
print ("var1[0]: ", var1[0])
print ("var2[1:5]: ", var2[1:5])
Python字符串更新
你可以截取字符串的一部分并與其他字段拼接,如下實(shí)例:
#!/usr/bin/python3
var1 = 'Hello World!'
print ("已更新字符串 : ", var1[:6] + 'Runoob!')
轉(zhuǎn)義字符 | 描述 |
---|---|
(在行尾時(shí)) | 續(xù)行符 |
\ | 反斜杠符號(hào) |
' | 單引號(hào) |
" | 雙引號(hào) |
\a | 響鈴 |
\b | 退格(Backspace) |
\e | 轉(zhuǎn)義 |
\000 | 空 |
\n | 換行 |
\v | 縱向制表符 |
\t | 橫向制表符 |
\r | 回車 |
\f | 換頁(yè) |
\oyy | 八進(jìn)制數(shù),yy代表的字符,例如:\o12代表?yè)Q行 |
\xyy | 十六進(jìn)制數(shù),yy代表的字符,例如:\x0a代表?yè)Q行 |
\other | 其它的字符以普通格式輸出 |
Python轉(zhuǎn)義字符
在需要在字符中使用特殊字符時(shí),python用反斜杠()轉(zhuǎn)義字符。如下表:
轉(zhuǎn)義字符 | 描述 |
---|---|
(在行尾時(shí)) | 續(xù)行符 |
\ | 反斜杠符號(hào) |
' | 單引號(hào) |
" | 雙引號(hào) |
\a | 響鈴 |
\b | 退格(Backspace) |
\e | 轉(zhuǎn)義 |
\000 | 空 |
\n | 換行 |
\v | 縱向制表符 |
\t | 橫向制表符 |
\r | 回車 |
\f | 換頁(yè) |
\oyy | 八進(jìn)制數(shù),yy代表的字符,例如:\o12代表?yè)Q行 |
\xyy | 十六進(jìn)制數(shù),yy代表的字符,例如:\x0a代表?yè)Q行 |
\other | 其它的字符以普通格式輸出 |
作業(yè)
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Created by master on 2018/5/16 14:22.
class Menu(object):
d_menu = {
'北京': {
'海淀': {
'五道口': {
'soho': {},
'網(wǎng)易': {},
'google': {}
},
'中關(guān)村': {
'愛(ài)奇藝': {},
'汽車之家': {},
'youku': {},
},
'上地': {
'百度': {},
},
},
'昌平': {
'沙河': {
'老男孩': {},
'北航': {},
},
'天通苑': {},
'回龍觀': {},
},
'朝陽(yáng)': {},
'東城': {},
},
'上海': {
'閔行': {
"人民廣場(chǎng)": {
'炸雞店': {}
}
},
'閘北': {
'火車戰(zhàn)': {
'攜程': {}
}
},
'浦東': {},
},
'山東': {},
}
# 保存層級(jí)供返回使用
into_menu = []
# 下一層
def parse_level(self, d):
for k, v in d.items():
print(k, end="\t")
print()
child = input("選擇子菜單:")
if d.get(child) is not None:
if len(d.get(child)) > 0 and d not in self.into_menu:
self.into_menu.append(d)
self.d_menu = d.get(child)
else:
print("已經(jīng)是最后一級(jí)了")
else:
print("子菜單不存在,請(qǐng)重新選擇!")
self.parse_level(d)
# 上一層
def last_menu(self):
if len(self.into_menu) > 0:
self.d_menu = self.into_menu.pop()
for k, v in self.d_menu.items():
print(k, end="\t")
print()
else:
print("已經(jīng)到達(dá)最頂級(jí)了")
# 命令區(qū)分
def start(self):
while True:
p = input("輸入命令:子菜單->q,返回上一層->w,退出->e\n")
if p == "Q" or p == "q":
self.parse_level(self.d_menu)
elif p == "W" or p == "w":
self.last_menu()
elif p == "E" or p == "e":
exit("感謝使用,再見(jiàn)")
else:
print("請(qǐng)輸入正確的命令!")
if __name__ == '__main__':
m = Menu()
m.start()