二进制
二进制是计算技术中广泛采用的一种数制。二进制数据是用0和1两个数码来表示的数。它的基数为2,进位规则是“逢二进一”,借位规则是“借一当二”,由18世纪德国数理哲学大师莱布尼兹发现。当前的计算机系统使用的基本上是二进制系统,数据在计算机中主要是以补码的形式存储的。计算机中的二进制则是一个非常微小的开关,用“开”来表示1,“关”来表示0。
常用进制转换的实现
十进制到二进制:
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码
在计算机中,所有的数据在存储和运算时都要使用二进制数表示(因为计算机用高电平和低电平分别表示1和0),例如,像a、b、c、d这样的52个字母(包括大写)、以及0、1等数字还有一些常用的符号(例如*、#、@等)在计算机中存储时也要使用二进制数来表示,而具体用哪些二进制数字表示哪个符号,当然每个人都可以约定自己的一套(这就叫编码),而大家如果要想互相通信而不造成混乱,那么大家就必须使用相同的编码规则,于是美国有关的标准化组织就出台了ASCII编码,统一规定了上述常用符号用哪些二进制数来表示。
美国标准信息交换代码是由美国国家标准学会(American National Standard Institute , ANSI )制定的,标准的单字节字符编码方案,用于基于文本的数据。起始于50年代后期,在1967年定案。它最初是美国国家标准,供不同计算机在相互通信时用作共同遵守的西文字符编码标准,它已被国际标准化组织(International Organization for Standardization, ISO)定为国际标准,称为ISO 646标准。适用于所有拉丁文字字母。
以下代码用于实现ASCII码与字符相互转换:
# 用户输入字符
c = input("请输入一个字符: ")
# 用户输入ASCII码,并将输入的数字转为整型
a = int(input("请输入一个ASCII码: "))
print( c + " 的ASCII 码为", ord(c))
print( a , " 对应的字符为", chr(a))
执行以上代码输出结果为:
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相应改变得到验证。
浅拷贝是在另一块地址中创建一个新的变量或容器,但是容器内的元素的地址均是源对象的元素的地址的拷贝。也就是说新的容器中指向了旧的元素( 新瓶装旧酒 )。
深拷贝,完全拷贝了一个副本,容器内部元素地址都不一样
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后,发现b没有发生任何改变,因为b是一个完全的副本,元素地址与a均不同,a修改不影响b。
深拷贝是在另一块地址中创建一个新的变量或容器,同时容器内的元素的地址也是新开辟的,仅仅是值相同而已,是完全的副本。
转自:https://www.jianshu.com/p/efa9dd51f5cc
字符串
字符串是 Python 中最常用的数据类型。我们可以使用引号('或")来创建字符串。
创建字符串很简单,只要为变量分配一个值即可。例如:
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!')
转义字符 | 描述 |
---|---|
(在行尾时) | 续行符 |
\ | 反斜杠符号 |
' | 单引号 |
" | 双引号 |
\a | 响铃 |
\b | 退格(Backspace) |
\e | 转义 |
\000 | 空 |
\n | 换行 |
\v | 纵向制表符 |
\t | 横向制表符 |
\r | 回车 |
\f | 换页 |
\oyy | 八进制数,yy代表的字符,例如:\o12代表换行 |
\xyy | 十六进制数,yy代表的字符,例如:\x0a代表换行 |
\other | 其它的字符以普通格式输出 |
Python转义字符
在需要在字符中使用特殊字符时,python用反斜杠()转义字符。如下表:
转义字符 | 描述 |
---|---|
(在行尾时) | 续行符 |
\ | 反斜杠符号 |
' | 单引号 |
" | 双引号 |
\a | 响铃 |
\b | 退格(Backspace) |
\e | 转义 |
\000 | 空 |
\n | 换行 |
\v | 纵向制表符 |
\t | 横向制表符 |
\r | 回车 |
\f | 换页 |
\oyy | 八进制数,yy代表的字符,例如:\o12代表换行 |
\xyy | 十六进制数,yy代表的字符,例如:\x0a代表换行 |
\other | 其它的字符以普通格式输出 |
作业
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Created by master on 2018/5/16 14:22.
class Menu(object):
d_menu = {
'北京': {
'海淀': {
'五道口': {
'soho': {},
'网易': {},
'google': {}
},
'中关村': {
'爱奇艺': {},
'汽车之家': {},
'youku': {},
},
'上地': {
'百度': {},
},
},
'昌平': {
'沙河': {
'老男孩': {},
'北航': {},
},
'天通苑': {},
'回龙观': {},
},
'朝阳': {},
'东城': {},
},
'上海': {
'闵行': {
"人民广场": {
'炸鸡店': {}
}
},
'闸北': {
'火车战': {
'携程': {}
}
},
'浦东': {},
},
'山东': {},
}
# 保存层级供返回使用
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("已经到达最顶级了")
# 命令区分
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()