您的位置:首页 > 编程语言 > Python开发

python基础-字典、enumerate、is和==区别、编码问题、一些有迷惑的方法

2017-10-25 16:07 681 查看
字典

fromkeys

一些容易混淆方法

enumerate枚举

is 区别

编码问题

字典

#字典的键是可哈希的,就是不可变数据类型 str,数字体,bool,元组
#键是唯一的
print("----------------")
dic = {"name":"aaaa",
"skill":["pthon","go"],
"hobby":("sing","internet"),
True:"aa",
3:"bb",
1:"dd",
(1,2):"cc"
}
print(dic["name"])
print(dic["skill"])
print(dic["hobby"])

print(dic[True])#?为啥不输出"aa"?如何让它输出"aa"?
print(dic[3])
print(dic[(1,2)])
print(dic[1])

####嵌套
print("----####嵌套-------")
print(dic["hobby"][0])

dic = {"name":"safly",
"skill":["pthon","go"],
"hobby":("sing","internet")
}

print("#############增1############")

dic["weigh"] = 75
print(dic)
#增2--'k': None
dic.setdefault("k")
print(dic)

dic.setdefault("m","n")
print(dic)

#如果字典中有name,不会做操作,没有的话就需要添加
dic.setdefault("name")
print(dic)

print("###############删###########")
dic.pop("skill")
print(dic)

#如果没有要删除的键,会报错
# dic.pop("skill")

a = dic.pop("skill","没有该键,该方法但不报错")
print(a)

#随机删除一个键值对
dic.popitem()
print(dic)

del dic["hobby"]
print(dic)

#清空
# dic.clear()
# print(dic)

print("###############改###########")

dic["name"] = "jinxing"
print(dic)

#update把dic1的键值对添加并覆盖到dic中
dic1 = {"name":"jjkk","ddsfsdf":"gegew"}
dic.update(dic1)
print(dic)
print(dic1)

print("############查############")

print(dic["name"])
#如果不存在name1键,就会报错
# print(dic1["name1"])

print(dic.get("name"))
#没有键值对返回None,但是不报错
print(dic.get("sdfsdf"))
print(dic.get("sf","没有这个键盘"))

print("############获取所有的键############")

keys = dic.keys()
print(keys)
print(type(keys))

for key in keys:
print(key)

print("############获取所有的值############")

values = dic.values()
print(values)
for i in values:
print(i)

print("---获取所有的键-----")
for i in dic:
print(i)

print("-------循环dic.items--------")
print(dic.items())
####循环获取里面的元组####
for i in dic.items():
print(i)

####循环获取里面的元组的键值对####
for key,vlalue in dic.items():
print(key,vlalue)


输出如下:

E:\python\python_sdk\python.exe E:/python/py_pro/safly.py
----------------
aaaa
['pthon', 'go']
('sing', 'internet')
dd
bb
cc
dd
----####嵌套-------
sing
#############增1############
{'name': 'safly', 'skill': ['pthon', 'go'], 'hobby': ('sing', 'internet'), 'weigh': 75}
{'name': 'safly', 'skill': ['pthon', 'go'], 'hobby': ('sing', 'internet'), 'weigh': 75, 'k': None}
{'name': 'safly', 'skill': ['pthon', 'go'], 'hobby': ('sing', 'internet'), 'weigh': 75, 'k': None, 'm': 'n'}
{'name': 'safly', 'skill': ['pthon', 'go'], 'hobby': ('sing', 'internet'), 'weigh': 75, 'k': None, 'm': 'n'}
###############删###########
{'name': 'safly', 'hobby': ('sing', 'internet'), 'weigh': 75, 'k': None, 'm': 'n'}
没有该键,该方法但不报错
{'name': 'safly', 'hobby': ('sing', 'internet'), 'weigh': 75, 'k': None}
{'name': 'safly', 'weigh': 75, 'k': None}
###############改###########
{'name': 'jinxing', 'weigh': 75, 'k': None}
{'name': 'jjkk', 'weigh': 75, 'k': None, 'ddsfsdf': 'gegew'}
{'name': 'jjkk', 'ddsfsdf': 'gegew'}
############查############
jjkk
jjkk
None
没有这个键盘
############获取所有的键############
dict_keys(['name', 'weigh', 'k', 'ddsfsdf'])
<class 'dict_keys'>
name
weigh
k
ddsfsdf
############获取所有的值############
dict_values(['jjkk', 75, None, 'gegew'])
jjkk
75
None
gegew
---获取所有的键-----
name
weigh
k
ddsfsdf
-------循环dic.items--------
dict_items([('name', 'jjkk'), ('weigh', 75), ('k', None), ('ddsfsdf', 'gegew')])
('name', 'jjkk')
('weigh', 75)
('k', None)
('ddsfsdf', 'gegew')
name jjkk
weigh 75
k None
ddsfsdf gegew

Process finished with exit code 0


fromkeys

print("----------")
dic = dict.fromkeys("abc",["aaa"])
print(dic)
print("----------")
dic = dict.fromkeys(("abc"),["a","b"])
print(dic)

print("----------")
dic = dict.fromkeys(["a","c"],[])
print(dic)
dic["a"].append("aaa")
dic["c"].append("bbb")
dic["d"] = ["ccc"]
dic["a"] = ["aaaagg"]
print(dic)
print("----------")
dic = dict.fromkeys([1,2,3],"杨姐")
dic[1]="ss"
print(dic)


输出如下:

E:\python\python_sdk\python.exe E:/python/py_pro/demo.py
----------
{'a': ['aaa'], 'b': ['aaa'], 'c': ['aaa']}
----------
{'a': ['a', 'b'], 'b': ['a', 'b'], 'c': ['a', 'b']}
----------
{'a': [], 'c': []}
{'a': ['aaaagg'], 'c': ['aaa', 'bbb'], 'd': ['ccc']}
----------
{1: 'ss', 2: '杨姐', 3: '杨姐'}

Process finished with exit code 0


一些容易混淆方法

tu3 = (2)
tu1 = ("aaa",1)
tu = ("aaa",)
tu4 = (True)
tu5 = ([1,3,4])
print(type(tu))
print(type(tu1))
print(type(tu3))
print(type(tu4))
print(type(tu5))

a,b = [1,2]
print(a,b)

a,b = (3,4)
print(a,b)


输出如下:

E:\python\python_sdk\python.exe E:/python/py_pro/demo.py
<class 'tuple'>
<class 'tuple'>
<class 'int'>
<class 'bool'>
<class 'list'>
1 2
3 4


enumerate枚举

li = ["dfdf","32fd","df"]
for i in enumerate(li):
print(i)

print("#############dic#################")
dic = {"a":"aa","b":"bb"}

for i in enumerate(dic):
print(i)

for i in enumerate(dic.keys()):
print(i)

for i in enumerate(dic.values()):
print(i)

print("------元组的方式输出---")
for i in enumerate(dic.items()):
print(i)

print("------非元组的方式输出---")
for i,j in enumerate(dic.items()):
print(i,j)

print("-----for dic.items------")
print(dic.items())
for i in dic.items():
print(i)

print("-----for v,k dic.items------")
for v,k in dic.items():
print(v,k)

print("-----for i keys------")
print(dic.keys())
for i in dic.keys():
print(i)

print("-----for i values------")
print(dic.values())
for i in dic.values():
print(i)

print("-----for i dic------")
print(dic)
for i in dic:
print(i,type(i))

print("#############str#################")
#第二个参数是从索引开始
str = "sfjwrejlwer"
for i in enumerate(str,2):
print(i)


输出如下:

E:\python\python_sdk\python.exe E:/python/py_pro/demo.py
(0, 'dfdf')
(1, '32fd')
(2, 'df')
#############dic#################
(0, 'a')
(1, 'b')
(0, 'a')
(1, 'b')
(0, 'aa')
(1, 'bb')
------元组的方式输出---
(0, ('a', 'aa'))
(1, ('b', 'bb'))
------非元组的方式输出---
0 ('a', 'aa')
1 ('b', 'bb')
-----for dic.items------
dict_items([('a', 'aa'), ('b', 'bb')])
('a', 'aa')
('b', 'bb')
-----for v,k dic.items------
a aa
b bb
-----for i keys------
dict_keys(['a', 'b'])
a
b
-----for i values------
dict_values(['aa', 'bb'])
aa
bb
-----for i dic------
{'a': 'aa', 'b': 'bb'}
a <class 'str'>
b <class 'str'>
#############str#################
(2, 's')
(3, 'f')
(4, 'j')
(5, 'w')
(6, 'r')
(7, 'e')
(8, 'j')
(9, 'l')
(10, 'w')
(11, 'e')
(12, 'r')

Process finished with exit code 0


is ==区别

str = "safly"
#内存地址
print(type(str),id(str))

#== is
s1 = "alex"
s2 = "alex"
#==比较的值
print(s1 == s2)
#比较的内存地址
print(s1 is s2)
print(id(s1),id(s2))

#-5到256 同一个内存地址,pychar优化了,是同一个内存地址值
print("----------")
num = 1
num1 = 1
print(num is num1)

num = 256
num1 = 256
print(num is num1)

num = -5
num1 = -5
print(num is num1)

nu = 259
nu1 = 259
print(nu is nu1)
print(id(nu),id(nu1))
print("----------")

#########列表、字典、元组、集合内存地址不一样##############
s1= [1,3]
s2 = [1,3]
print(s1 == s2)
print(s1 is s2)
print(id(s1),id(s2))


输出如下:

E:\python\python_sdk\python.exe E:/python/py_pro/demo.py
<class 'str'> 2319200
True
True
16064928 16064928
----------
True
True
True
True
3990112 3990112
----------
True
False
4193136 4193176

Process finished with exit code 0


由于pychar优化了,我们看下在doc命令行中看看内存地址is方法的区别



另外字符这里需要补充下字符串不能有空格、字符长度不能超过20,不能有特殊字符



编码问题

py3:
unicode   A :00000000 00000000 00000000 00001001 四个字节
中 :00000000 00001000 00000000 00000001 四个字节

utf-8     A      :00000001 一个字节
欧洲@   : 00000010 00000001 两个字节
亚洲 中 : 00001000 00000000 00000001 三个字节
中国:00001000 00000000 00000001 00001001 00000000 00000001

gbk       A :00000000 00001001 两个字节
中 :00000000 00100001 两个字节
不同的编码之间是不能相互识别,会产生乱码。

存储,传输的:utf-8,或者 gbk,或者是gb2312,或者是其他(绝对不是unicode)。


我们看一个简单的例子

s = 'Q'
b1 = s.encode('utf-8')
print(b1)

b2 = s.encode('gbk')
print(b2)

s1 = '晓梅'
b11 = s1.encode('utf-8')
print(b11)
s2 = '晓梅'
b22 = s1.encode('gbk')
print(b22)


输出如下:

E:\python\python_sdk\python.exe E:/python/py_pro/demo.py
b'Q'
b'Q'
b'\xe6\x99\x93\xe6\xa2\x85'
b'\xcf\xfe\xc3\xb7'

Process finished with exit code 0


简单分析下

py3:
int

bytes  表现形式: s = b'alex' 内部存储是(utf-8,gbk,gb2312.....)010101
s1 = '晓梅'
b11 = s1.encode('utf-8')
表现形式: s = b'\xe6\x99\x93\xe6\xa2\x85'  (utf-8,gbk,gb2312.....)010101
0000 1000 0000 0000 0000 0001 0000 1001 0000 0000 0000 0001
s2 = '晓梅'
b22 = s1.encode('gbk')
print(b22)
b'\xcf\xfe\xc3\xb7'
表现形式: s = b'\xcf\xfe\xc3\xb7'  (utf-8,gbk,gb2312.....)010101
0000 1000 0000 0000 0000 0001 0000 1001
str    表现形式: s = 'alex' 内部存储是 unicode 0101010
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: