‘壹’ python 字典可以储存函数吗
Python中是没有switch的, 所以有时我们需要用switch的用法, 就只能通过if else来实现了. 但if else写起来比较冗长,
这时就可以使用Python中的dict来实现, 比switch还要简洁. 用法如下:
如果是key1的情况就执行func1, 如果是key2的情况就执行func2...(func1, func2...所有的函数的参数形式需要相同),
假设各个函数参数均为(arg1, arg2):
dictName = {"key1":func1, "key2":func2, "key3":func3"...}#字典的值直接是函数的名字,不能加引号dictName[key](arg1, arg2)
示例代码如下:
#!/usr/bin/python#File: switchDict.py#Author: lxw#Time: 2014/10/05import redef add(x, y): return x + ydef sub(x, y): return x - ydef mul(x, y): return x * ydef div(x, y): return x / ydef main():
inStr = raw_input("Please input the easy expression:(e.g. 1 + 2.But 1 + 2 + 3 are not accepted.\n")
inList = re.split("(\W+)", inStr)
inList[1] = inList[1].strip() print("-------------------------") print(inList) print("-------------------------") #Method 1:
if inList[1] == "+": print(add(int(inList[0]), int(inList[2]))) elif inList[1] == "-": print(sub(int(inList[0]), int(inList[2]))) elif inList[1] == "*": print(mul(int(inList[0]), int(inList[2]))) elif inList[1] == "/": print(div(int(inList[0]), int(inList[2]))) else: pass
#Method 2:
try:
operator = {"+":add, "-":sub, "*":mul, "/":div} print(operator[inList[1]](int(inList[0]), int(inList[2]))) except KeyError: passif __name__ == '__main__':
main()
Output:
PS J:\> python .\switchDict.py
Please input the easy expression:(e.g. 1 + 2.But 1 + 2 + 3 are not accepted.1 + 2
-------------------------['1', '+', '2']-------------------------
3
3PS J:\> python .\switchDict.py
Please input the easy expression:(e.g. 1 + 2.But 1 + 2 + 3 are not accepted.4 - 9
-------------------------['4', '-', '9']-------------------------
-5
-5PS J:\> python .\switchDict.py
Please input the easy expression:(e.g. 1 + 2.But 1 + 2 + 3 are not accepted.6 / 5
-------------------------['6', '/', '5']-------------------------
1
1PS J:\> python .\switchDict.py
Please input the easy expression:(e.g. 1 + 2.But 1 + 2 + 3 are not accepted.1 9 9
-------------------------['1', '', '9', ' ', '9']-------------------------PS J:\> python .\switchDict.py
Please input the easy expression:(e.g. 1 + 2.But 1 + 2 + 3 are not accepted.1 ( 9
-------------------------['1', '(', '9']-------------------------PS J:\>
个人感觉, 如果想用switch来解决某个问题, 并且每种情况下的操作在形式上是相同的(如都执行某个函数并且这些函数有
相同的参数), 就可以用这种方法来实现.
‘贰’ python有缓存模块吗
从Python 3.2开始,可以使用functools库中的装饰器@lru_cache。这是最近使用过的缓存,所以其中的项目没有到期时间,但作为快速入侵,它非常有用。
from functools import lru_cache
@lru_cache(maxsize=256)def f(x):
return x*xfor x in range(20):
print f(x)for x in range(20):
print f(x)
‘叁’ 如何用python dict存储大量数据
我们以往的经验,生成对比信息的字典代码如下:
def getCurrentCompareMessageDict0(dict0, dict1):
'''未被优化的获取当前对比信息字典'''
dlist0=list(dict0.keys())
dlist1=list(dict1.keys())
dict2={}
for i in range(len(dlist1)):
if dlist1[i] not in dlist0:
key=dlist1[i]
value=[0, dict1[dlist1[i]]]
dict2[key]=value
else:
if dict1[dlist1[i]]/100.0 != dict0[dlist1[i]]:
key=dlist1[i]
value=[dict0[dlist1[i]], dict1[dlist1[i]]]
dict2[key]=value
return dict2
即,先构建两个dict的key列表。
然后,以key列表的长度为上限,进行for循环,采用DICT[KEY]的方式来进行列表数据的筛选。
这个方法的运行是超级慢的。
‘肆’ python中UserDict和dict
你看看UserDict的代码就知道了。
clear的代码里只有一句:self.data.clear()
而update则有两种情况:
1. 你传入的参数是一个dict,或者是命名参数(a='x',b='y'..这样的形式)直接调用self.data.update
2. 你传入的参数有items属性则for k,v in 参数.items(): self[k]=v
说白了就是UserDict重新包装了作为.data属性的dict,所以可以直接调用;而且有些UserDict的方法还有一些它自己的逻辑,增加一点点功能。
‘伍’ python中的dictionary
dict是字典,用键值对key : value的方式来存储数据,内部实现是哈希表。
‘陆’ python把字典存到redis怎么使用
python把字典存到redis怎么使用
先写个测试redis是否正常连接上
import redis
cache = redis.StrictRedis('172.20.0.227',6379)
存储字符串
key = "javaman_test"
value = "test_string_yy"
cachevalue = cache.get(key)
存储Dict对象,取出来为字符串
value = {"id":1,"name":"sunxy"}
cache.set(key,value,60)
cachevalue = cache.get(key)
print type(value),type(cachevalue)
这时使用eval()对获取的结果转换成dict
cachevalue = cache.get(key)
trans_value = eval(cachevalue)
print type(trans_value),trans_value.get("name")
如果不是一个dict,直接是一个对象呢?
之前用了django中的对象,来看一下
取出来仍然是字符串,如何把对象存进去呢
eval()只是将结果转换成字典,这个肯定不行,我们应该需要将对象存到redis中。
使用pickle模块,在存入到redis中时调用mps函数,获取后调用loads函数
import pickleredis.set(key,pickle.mps(xt_instry),180)
pickle.loads(result)
‘柒’ python内建函数
其实安装python包会自带一个有问号标示“?”的"Python Manuals"可以仔细阅读一下,也可作帮助文档的。
介绍Python的内建函数和异常.许多内建函数的细节及特性可以在这里找到.
内建函数
本节介绍的函数在解释器中总是可用的,他们被包含在 __builtin__ 模块里.另外每个模块的 __builtins__ 属性经常指的是这个模块(除了当在restricted execution环境下运行时).
_(下划线)
默认情况下,变量 _ 用于在交互模式下表示最近一个表达式的运行结果.
参阅 sys.displayhook (118)
__import__(name [, globals [, locals [, fromlist]]])
import语句通过调用这个函数来导入模块. name是包含模块名字的字符串, globals是一个可选的定义全局名称空间的字典, locals是定义局部名称空间的字典, fromlist是from语句目标的列表.例如, import spam语句会调用__import__('spam', globals(), locals(), []) ,而from spam import foo 语句会调用 __import__('spam', globals(), locals(), ['foo']). 如果模块名在包名字之后(如foo.bar)而且fromlist为空时,就返回对应的模块对象.如果fromlist不为空,则只会返回最顶级的包.
这个函数是一个低等级的模块载入接口.它并不执行import语句的所有步骤(通常情况下局部名称空间并不会随模块中包含对象的名称引用的改变而改变.这个函数可以由用户来重新定义,这样为import语句加入新的行为.默认的执行并不会检查locals参数,而globals只用于决定包的内容(这些参数可以使 __import__()能够完整地访问全局和局部名称空间)
abs(x)
返回x的绝对值
apply(func [, args [, keywords]])
对可调用对象func执行函数调用. args是一个包含固定位置参数的元组, keywords是包含关键参数的字典. apply()函数也可以写做func(*args ,**keywords ).
buffer(sequence [, offset [, size]])
创建一个新的缓冲器对象.缓冲器通常是一个序列(如字符串)的字节导向序列.缓冲器和字符串在许多地方是相同的,但是它不支持字符串方法,而且也不能使用string模块的函数.
callable(object)
当object为可调用对象时返回True,否则返回False
chr(i)
将一个0到255的整数转换为一个字符.
cmp(x,y)
比较x和y. x< y返回负数; x== y返回零; x> y返回整数.它可以比较任意两个对象并返回结果,即使有时候对象的比较豪无意义(例如比较文件对象).在某些环境下,这样的比较会引发异常.
coerce(x,y)
将x和y值转换为同一个数值类型并作为一个元组返回.(第三章,类型和对象)
compile(string, filename, kind)
使用exec()或eval()将字符串编译为代码对象. filename is a string containing the name of the file in which the string was defined. kind为'exec'时代表一个表达式的序列, 'eval'代表一个表达式, 'single'代表一个运行语句.
complex(real [, imag])
创建一个复数
delattr(object, attr)
删除对象的一个属性, attr是一个字符串.与 del object.attr相同
dir([object])
返回包含属性名称的列表.它们来自对象的 __dict__, __methods__,以及 __members__ 属性.如果没有传递给它参数,则会返回当前的local symbol table
divmod(a,b)
返回一个包含商和余数的元组.对于整数,将返回(a / b , a % b ),对于浮点数,将返回(math.floor(a / b ), a % b )
eval(expr [, globals [, locals]])
计算一个表达式的值. expr是一个字符串或由compile()创建的一个代码对象. globals和locals为操作定义的全局和局部名称空间,当省略时,表达式将在调用时的名称空间计算.
execfile(filename [, globals [, locals]])
运行文件filename中的语句. globals和locals定义了文件运行的全局和局部名称空间,当省略时,文件将在调用时的名称空间运行.这个函数不能在一个函数主体里使用,因为它与内嵌范围不相容.
filter(function, list)
使用func()函数来过滤s中的元素.使func返回值为false的元素被丢弃,其它的存入filter函数返回的列表中.如果function是None,则list中值为False的元素就被删除.
float(x)
将x转换为浮点数
getattr(object, name [, default])
返回一个对象的属性. name是一个字符串. default是一个可选的值,代表当没有这个属性时返回的值. 与 object.name 结果相同
globals()
返回一个与全局名称空间对应的字典
hasattr(object, name)
返回object是否有name属性,布尔值
hash(object)
返回一个对象的整数哈希值(如果可能).两个相等对象的哈希值是相同的.模块没有定义一个哈希值.
hex(x)
将一个整数或长整数转换为一个十六进制的字符串
id(object)
返回一个对象的整数id
input([prompt])
相当于eval(raw_input(prompt ))
int(x [, base])
将一个数字或字符串转换为整数. 可选参数base代表从字符串转换时的基础/根据
intern(string)
Checks to see whether string is contained in an internal table of strings. If found, a of the internal string is returned. If not, string is added to the internal table and returned. This function is primarily used to get better performance in operations involving dictionary lookups. Interned strings are never garbage-collected. Not applicable to Unicode strings.
isinstance(object, classobj)
检查object是否是classobj的事例或子类.也可用于检查类型
issubclass(class1, class2)
检查class1是否是class2的子类(派生类)
注意: issubclass(A , A )返回True
len(s)
返回序列s中包含的条目数目
list(s)
返回一个包含序列s中条目的新列表
locals()
返回一个与调用时局部名称空间相对应的字典
long(x [, base])
将一个数字或字符串转换为长整数,可选参数base代表从字符串转换时的基础/根据
map(function, list, ...)
将序列list中的每个元素传递给function函数做参数,函数的返回值组成列表并返回.如果提供给多个列表,则函数应包含有多个参数,每个参数从不同的列表获得.如果函数为None,则默认为 identity function(?身份函数).如果None映射到多个列表,则返回一个包含元组的列表,元组的每个元素分别来自各个列表.如果有必要,短的列表将使用None来扩充到与最长列表长度相等. map可以使用list comprehensions 来代替.例如map(function , alist ),可以使用[function (x) for x in alist ]来代替
参阅 zip (105).
max(s [, args, ...])
单个参数时,返回序列s中的最大值.多个参数时,返回值最大的参数
min(s [, args, ...])
单个参数时,返回序列s中的最小值.多个参数时,返回值最小的参数
oct(x)
将一个整数或者长整数转换为八进制字符串
open(filename [, mode [, bufsize]])
打开文件filename并返回一个文件对象(第十章,运行环境). mode代表文件打开的模式. 'r' 表示读, 'w' 表示写, 'a' 表示在文件末尾添加内容. 还有一种更新模式,你只要在读写模式后增加一个'+'就可以使用这种模式,如'r+' 或 'w+'.当一个文件以更新模式打开,你就可以对这个文件进行读写操作.只要在任何读取操作之前刷新所有的输出缓冲就不会有问题.如果一个文件以 'w+' 模式打开,它的长度就度截为 0.当mode省略时,将会使用'w'模式.bufsize参数指定了缓冲行为, 0代表无缓冲,1代表行缓冲,其他正数代表一个大约的字节缓冲器大小,负数代表使用系统默认缓冲器大小(也是默认行为)
ord(c)
返回单个字符c的整数顺序值.普通字符返回[0,255]中的一个值,Unicode字符返回 [0,65535]中的一个值
pow(x, y [, z])
返回x ** y ,如果z存在返回(x ** y ) % z
range([start,] stop [, step])
返回一个从start到stop的整数序列, step代表步进,默认值为1. start默认值为0.负数的step可以创建一个递减的整数序列
参阅xrange (105)
raw_input([prompt])
从标准输入(sys.stdin)中读取一行,并把它作为字符串返回.如果提供了prompt,它将首先打印到标准输出(sys.stdout).当读取到一个EOF时,就会引发一个EOFError异常.如果readline模块被导入,那么这个函数会使用它来提供更高级的功能
rece(func, seq [, initializer])
函数从一个序列收集信息,然后只返回一个值(例如求和,最大值,等).它首先以序列的前两个元素调用函数,再将返回值和第三个参数作为参数调用函数,依次执行下去,返回最终的值. func函数有且只有两个参数.在seq为空时,将使用初始值initializer.
reload(mole)
重新导入一个已经导入的模块. mole必须是一个已经存在的模块对象.一般情况下并不鼓励使用这个函数,除了在调试的时候.
当一个模块重导入时,定义它的全局名称空间的字典依然存在.Thus, definitions in the old mole that aren’t part of the newly reloaded mole are retained.模块可以利用这个来检查他们是否已经被导入.
重导入一个使用C编写的模块通常是不合法的
If any other moles have imported this mole by using the from statement, they’ll continue to use the definitions in the previously imported mole. This problem can be avoided by either reissuing the from statement after a mole has been reloaded or using fully qualified names such as mole.name .
如果有使用以前模块中类创建的实例,它们将继续使用以前的模块
repr(object)
返回一个对象的标准字符串表示.与向后的引号 `object` 相同.大多数情况下,返回的字符串可以使用eval()来再次创建这个对象.
round(x [, n])
Returns the result of rounding the floating-point number x to the closest multiple of 10 to the power minus n . If n is omitted, it defaults to 0. If two multiples are equally close, rounding is done away from 0 (例如, 0.5 is rounded to 1.0 and -0.5 is rounded to -1.0).
setattr(object, name, value)
设置一个对象的属性. name是一个字符串. 相当于object.name = value .
slice([start,] stop [, step])
返回一个代表指定数列中一个整数的切片对象.切片对象也可以有扩展切片操作语句来产生.(第三章,序列和映射方法)
str(object)
返回表示对象的可打印形式的字符串.与print语句产生的字符串相同.
tuple(s)
从序列s中创建一个元组.如果s已经是一个元组,则返回s
type(object)
返回object的类型,它是一个types模块中定义type类型
参阅isinstance (102)
unichr(i)
将一个0到65535的整数转换为一个Unicode字符
unicode(string [, encoding [, errors]])
将string转换为Unicode字符串. encoding指定了string的数据编码,它被省略时,将使用sys.getdefaultencoding(). errors指定编码错误处理方式.('strict', 'ignore', 或 'replace' .参阅第三章和第九章中有关Unicode内容)
vars([object])
返回object的 symbol table (通常在object的__dict__属性).如果没有给它提供参数,则返回对应当前局部名称空间的字典.
xrange([start,] stop [, step])
和range函数相似,但返回的是一个XRangeType对象.它生成一个迭代器,就是只有用那个数时才临时通过计算提供值,而不是全部储存它们.这样在处理大的数列时能节省大量的内存.
zip(s1 [, s2 [,..]])
用来将几个序列组合成一个包含元组的序列,序列中的每个元素t[i ] = (s1[i ], s2[i ], ..., sn[i ]).结果与最短序列的长度相等.
‘捌’ python dict怎么实现的
Python中dict对象是表明了其是一个原始的Python数据类型,按照键值对的方式存储,其中文名字翻译为字典,顾名思义其通过键名查找对应的值会有很高的效率,时间复杂度在常数级别O(1).dict底层实现(推荐学习:Python视频教程)
在Python2中,dict的底层是依靠哈希表(Hash Table)进行实现的,使用开放地址法解决冲突.
所以其查找的时间复杂度会是O(1).
Dict的操作实现原理(包括插入、删除、以及缓冲池等)
首先介绍:PyDictObject对象的元素搜索策略:
有两种搜索策略,分别是lookdict和lookdict_string,lookdict_string就是lookdict在对于PyStringObject进行搜索时的特殊形式,那么通用的搜索策略lookdict的主要逻辑是:
(1)对第一个entry的查找:
a)根据hash值获得entry的索引
b)若entry处于unused态,则搜索结束;若entry所指向的key与搜索的key相同,则搜索成功
c)若当前entry处于mmy态,则设置freeslot(这里的freeslot是可以返回作为下一个立即可用的地址来存储entry)
d)检查Active态的entry,若其key所指向的值与搜索的值相同,则搜索成功
(2)对剩余的探测链中的元素的遍历查找:
a)根据所采用的探测函数,获得探测链上的下一个待检查的entry
b)检查到一个unused态的entry,表明搜索失败:
如果freeslot不为空,则返回freeslot;否则返回unused态的entry
c)检查entry的key与所搜索的key的引用是否相同,相同则搜索成功,返回entry
d)检查entry的key与所搜索的key的值是否相同,相同则搜索成功,返回entry
e)遍历过程中,发现mmy态的entry,且freeslot未设置,则设置freeslot
接下来是:PyDictObject对象的元素插入与删除的策略:
需要首先用到搜索策略,搜索成功,则直接将值进行替换,搜索失败,返回unused态或mmy态的entry,设置key、value和hash值,并且根据目前插入的元素情况进行ma_table的大小的调整(调整的依据就是装载率,根据是否大于2/3来进行调整);删除也是类似,先计算hash值,然后搜索相应的entry,搜索成功,删除entry中维护的元素,将entry从Active态修改为mmy态
在PyDictObject的实现过程中,会用到缓冲池,在PyDictObject对象被销毁的时候,才开始接纳被缓冲的PyDictObject对象,定义的缓冲池可接纳的对象数量是80个,创建新PyDictObject对象的时候,如果缓冲池中有,则可以直接从缓冲池中取出使用
更多Python相关技术文章,请访问Python教程栏目进行学习!以上就是小编分享的关于python dict怎么实现的的详细内容希望对大家有所帮助,更多有关python教程请关注环球青藤其它相关文章!
‘玖’ Python中的dict怎么用
#字典的添加、删除、修改操作
dict={"a":"apple","b":"banana","g":"grape","o":"orange"}
dict["w"]="watermelon"
del(dict["a"])
dict["g"]="grapefruit"
printdict.pop("b")
printdict
dict.clear()
printdict
#字典的遍历
dict={"a":"apple","b":"banana","g":"grape","o":"orange"}
forkindict:
print"dict[%s]="%k,dict[k]
#字典items()的使用
dict={"a":"apple","b":"banana","c":"grape","d":"orange"}
#每个元素是一个key和value组成的元组,以列表的方式输出
printdict.items()
#调用items()实现字典的遍历
dict={"a":"apple","b":"banana","g":"grape","o":"orange"}
for(k,v)indict.items():
print"dict[%s]="%k,v
#调用iteritems()实现字典的遍历
dict={"a":"apple","b":"banana","c":"grape","d":"orange"}
printdict.iteritems()
fork,vindict.iteritems():
print"dict[%s]="%k,v
for(k,v)inzip(dict.iterkeys(),dict.itervalues()):
print"dict[%s]="%k,v
#使用列表、字典作为字典的值
dict={"a":("apple",),"bo":{"b":"banana","o":"orange"},"g":["grape","grapefruit"]}
printdict["a"]
printdict["a"][0]
printdict["bo"]
printdict["bo"]["o"]
printdict["g"]
printdict["g"][1]
dict={"a":"apple","b":"banana","c":"grape","d":"orange"}
#输出key的列表
printdict.keys()
#输出value的列表
printdict.values()
#每个元素是一个key和value组成的元组,以列表的方式输出
printdict.items()
dict={"a":"apple","b":"banana","c":"grape","d":"orange"}
it=dict.iteritems()
printit
#字典中元素的获取方法
dict={"a":"apple","b":"banana","c":"grape","d":"orange"}
printdict
printdict.get("c","apple")
printdict.get("e","apple")
#get()的等价语句
D={"key1":"value1","key2":"value2"}
if"key1"inD:
printD["key1"]
else:
print"None"
#字典的更新
dict={"a":"apple","b":"banana"}
printdict
dict2={"c":"grape","d":"orange"}
dict.update(dict2)
printdict
#udpate()的等价语句
D={"key1":"value1","key2":"value2"}
E={"key3":"value3","key4":"value4"}
forkinE:
D[k]=E[k]
printD
#字典E中含有字典D中的key
D={"key1":"value1","key2":"value2"}
E={"key2":"value3","key4":"value4"}
forkinE:
D[k]=E[k]
printD
#设置默认值
dict={}
dict.setdefault("a")
printdict
dict["a"]="apple"
dict.setdefault("a","default")
printdict
#调用sorted()排序
dict={"a":"apple","b":"grape","c":"orange","d":"banana"}
printdict
#按照key排序
printsorted(dict.items(),key=lambdad:d[0])
#按照value排序
printsorted(dict.items(),key=lambdad:d[1])
#字典的浅拷贝
dict={"a":"apple","b":"grape"}
dict2={"c":"orange","d":"banana"}
dict2=dict.()
printdict2
#字典的深拷贝
import
dict={"a":"apple","b":{"g":"grape","o":"orange"}}
dict2=.deep(dict)
dict3=.(dict)
dict2["b"]["g"]="orange"
printdict
dict3["b"]["g"]="orange"
printdict
‘拾’ python dict什么实现
Python就是用c实现的,你说可以不可以?另外,c实现的这种哈希表+链表的二维数据结构,其实也有实例:memcached中的缓存就是同一种数据结构。只不过,在python里面,链表用于维持有序性(foreach/push/pop的时候用到),而mc中,链表则用于淘汰算法LRU。