二進制
二進制是計算技術中廣泛采用的一種數(shù)制胡岔。二進制數(shù)據是用0和1兩個數(shù)碼來表示的數(shù)炫加。它的基數(shù)為2,進位規(guī)則是“逢二進一”屹篓,借位規(guī)則是“借一當二”,由18世紀德國數(shù)理哲學大師萊布尼茲發(fā)現(xiàn)匙奴。當前的計算機系統(tǒng)使用的基本上是二進制系統(tǒng)堆巧,數(shù)據在計算機中主要是以補碼的形式存儲的。計算機中的二進制則是一個非常微小的開關,用“開”來表示1谍肤,“關”來表示0啦租。
常用進制轉換的實現(xià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])
十進制到八進制:
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])
十進制到十六進制:
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碼
在計算機中,所有的數(shù)據在存儲和運算時都要使用二進制數(shù)表示(因為計算機用高電平和低電平分別表示1和0)荒揣,例如刷钢,像a、b乳附、c内地、d這樣的52個字母(包括大寫)、以及0赋除、1等數(shù)字還有一些常用的符號(例如*阱缓、#、@等)在計算機中存儲時也要使用二進制數(shù)來表示举农,而具體用哪些二進制數(shù)字表示哪個符號荆针,當然每個人都可以約定自己的一套(這就叫編碼),而大家如果要想互相通信而不造成混亂颁糟,那么大家就必須使用相同的編碼規(guī)則航背,于是美國有關的標準化組織就出臺了ASCII編碼,統(tǒng)一規(guī)定了上述常用符號用哪些二進制數(shù)來表示棱貌。
美國標準信息交換代碼是由美國國家標準學會(American National Standard Institute , ANSI )制定的玖媚,標準的單字節(jié)字符編碼方案,用于基于文本的數(shù)據婚脱。起始于50年代后期今魔,在1967年定案。它最初是美國國家標準障贸,供不同計算機在相互通信時用作共同遵守的西文字符編碼標準错森,它已被國際標準化組織(International Organization for Standardization, ISO)定為國際標準,稱為ISO 646標準篮洁。適用于所有拉丁文字字母涩维。
以下代碼用于實現(xiàn)ASCII碼與字符相互轉換:
# 用戶輸入字符
c = input("請輸入一個字符: ")
# 用戶輸入ASCII碼,并將輸入的數(shù)字轉為整型
a = int(input("請輸入一個ASCII碼: "))
print( c + " 的ASCII 碼為", ord(c))
print( a , " 對應的字符為", chr(a))
執(zhí)行以上代碼輸出結果為:
python3 test.py
請輸入一個字符: a
請輸入一個ASCII碼: 101
a 的ASCII 碼為 97
101 對應的字符為 e
深淺copy
python中的深拷貝和淺拷貝和java里面的概念是一樣的袁波,所謂淺拷貝就是對引用的拷貝瓦阐,所謂深拷貝就是對對象的資源的拷貝。
首先锋叨,對賦值操作我們要有以下認識:
賦值是將一個對象的地址賦值給一個變量垄分,讓變量指向該地址( 舊瓶裝舊酒 )。
修改不可變對象(str娃磺、tuple)需要開辟新的空間
修改可變對象(list等)不需要開辟新的空間
淺拷貝僅僅復制了容器中元素的地址
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地址都一樣豺瘤,說明淺拷貝知識將容器內的元素的地址復制了一份。這可以通過修改后听诸,b中字符串沒改變坐求,但是list元素隨著a相應改變得到驗證。
淺拷貝是在另一塊地址中創(chuàng)建一個新的變量或容器晌梨,但是容器內的元素的地址均是源對象的元素的地址的拷貝桥嗤。也就是說新的容器中指向了舊的元素( 新瓶裝舊酒 )。
深拷貝仔蝌,完全拷貝了一個副本泛领,容器內部元素地址都不一樣
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中的元素地址均不同渊鞋,這是完全拷貝的一個副本,修改a后瞧挤,發(fā)現(xiàn)b沒有發(fā)生任何改變锡宋,因為b是一個完全的副本,元素地址與a均不同特恬,a修改不影響b执俩。
深拷貝是在另一塊地址中創(chuàng)建一個新的變量或容器,同時容器內的元素的地址也是新開辟的癌刽,僅僅是值相同而已奠滑,是完全的副本。
轉自:http://www.reibang.com/p/efa9dd51f5cc
字符串
字符串是 Python 中最常用的數(shù)據類型妒穴。我們可以使用引號('或")來創(chuàng)建字符串宋税。
創(chuàng)建字符串很簡單,只要為變量分配一個值即可讼油。例如:
var1 = 'Hello World!'
## Python 訪問字符串中的值
Python 不支持單字符類型杰赛,單字符在 Python 中也是作為一個字符串使用。
Python 訪問子字符串矮台,可以使用方括號來截取字符串乏屯,如下實例:
## 實例(Python 3.0+)
#!/usr/bin/python3
var1 = 'Hello World!'
var2 = "Runoob"
print ("var1[0]: ", var1[0])
print ("var2[1:5]: ", var2[1:5])
Python字符串更新
你可以截取字符串的一部分并與其他字段拼接,如下實例:
#!/usr/bin/python3
var1 = 'Hello World!'
print ("已更新字符串 : ", var1[:6] + 'Runoob!')
轉義字符 | 描述 |
---|---|
(在行尾時) | 續(xù)行符 |
\ | 反斜杠符號 |
' | 單引號 |
" | 雙引號 |
\a | 響鈴 |
\b | 退格(Backspace) |
\e | 轉義 |
\000 | 空 |
\n | 換行 |
\v | 縱向制表符 |
\t | 橫向制表符 |
\r | 回車 |
\f | 換頁 |
\oyy | 八進制數(shù)瘦赫,yy代表的字符辰晕,例如:\o12代表換行 |
\xyy | 十六進制數(shù),yy代表的字符确虱,例如:\x0a代表換行 |
\other | 其它的字符以普通格式輸出 |
Python轉義字符
在需要在字符中使用特殊字符時含友,python用反斜杠()轉義字符。如下表:
轉義字符 | 描述 |
---|---|
(在行尾時) | 續(xù)行符 |
\ | 反斜杠符號 |
' | 單引號 |
" | 雙引號 |
\a | 響鈴 |
\b | 退格(Backspace) |
\e | 轉義 |
\000 | 空 |
\n | 換行 |
\v | 縱向制表符 |
\t | 橫向制表符 |
\r | 回車 |
\f | 換頁 |
\oyy | 八進制數(shù),yy代表的字符窘问,例如:\o12代表換行 |
\xyy | 十六進制數(shù)辆童,yy代表的字符,例如:\x0a代表換行 |
\other | 其它的字符以普通格式輸出 |
作業(yè)
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Created by master on 2018/5/16 14:22.
class Menu(object):
d_menu = {
'北京': {
'海淀': {
'五道口': {
'soho': {},
'網易': {},
'google': {}
},
'中關村': {
'愛奇藝': {},
'汽車之家': {},
'youku': {},
},
'上地': {
'百度': {},
},
},
'昌平': {
'沙河': {
'老男孩': {},
'北航': {},
},
'天通苑': {},
'回龍觀': {},
},
'朝陽': {},
'東城': {},
},
'上海': {
'閔行': {
"人民廣場": {
'炸雞店': {}
}
},
'閘北': {
'火車戰(zhàn)': {
'攜程': {}
}
},
'浦東': {},
},
'山東': {},
}
# 保存層級供返回使用
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("已經是最后一級了")
else:
print("子菜單不存在惠赫,請重新選擇把鉴!")
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("已經到達最頂級了")
# 命令區(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("感謝使用儿咱,再見")
else:
print("請輸入正確的命令庭砍!")
if __name__ == '__main__':
m = Menu()
m.start()