一、isinstance()函数
参考资料:Python isinstance() 函数 | 菜鸟教程
isinstance(object,classinfo): object是实例对象。classinfo 可以是直接或间接类名、基本类型或者由它们组成的元组。如果对象的类型与参数二的类型(classinfo)相同(如果参数二是元组,只要与元组中的一个相同就返回True)则返回 True,否则返回 False。
isinstance() 函数来判断一个对象是否是一个已知的类型,类似 type()。
isinstance() 与 type() 区别:
-
type() 不会认为子类是一种父类类型,不考虑继承关系。
-
isinstance() 会认为子类是一种父类类型,考虑继承关系。
如果要判断两个类型是否相同推荐使用 isinstance()。
二、enumerate() 函数
参考资料:Python enumerate() 函数 | 菜鸟教程
enumerate() 函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中。
enumerate(sequence,[start=0]):sequence -- 一个序列、迭代器或其他支持迭代对象。start -- 下标起始位置。返回 enumerate(枚举) 对象。
testlist=['a','b','c']
for i,element in enumerate(testlist):
print(i,element)
结果:
0 a
1 b
2 c
三、 Counter函数
参考资料:https://blog.csdn.net/qq_24753293/article/details/78334140
counter作用就是在一个数组内,遍历所有元素,将元素出现的次数记下来。在c++中,实现该功能通常需要先将其放入map中,如map<key类型,val类型> nummap的形式,之后需要auto [key,val]:nummap来获得。
而使用python会非常的简单:
结果显示:元素1出现了1次,元素3出现了2次,元素2出现了3次,元素5出现了1次,元素7出现了1次。
四、dict()函数
参考资料:http://www.pythontip.com/blog/post/11650/
https://blog.csdn.net/zhpf225/article/details/100673547
dict与c++中map基本一致,
每一个元素是pair,包含key、value两部分。key是Integer或string类型,value 是任意类型。键是唯一的,字典只认最后一个赋的键值。
dict():创建空字典
dict = {'ob1':'computer', 'ob2':'mouse', 'ob3':'printer'}
D.get(key, 0) #同dict[key],多了个没有则返回缺省值,0。[]没有则抛异常 D.has_key(key) #有该键返回TRUE,否则FALSE D.keys() #返回字典键的列表 D.values() #以列表的形式返回字典中的值,返回值的列表中可包含重复元素 D.items() #将所有的字典项以列表方式返回,这些列表中的每一项都来自于(键,值),但是项在返回时并没有特殊的顺序 D.update(dict2) #增加合并字典 D.popitem() #得到一个pair,并从字典中删除它。已空则抛异常 D.clear() #清空字典,同del dict D.copy() #拷贝字典 D.cmp(dict1,dict2) #比较字典,(优先级为元素个数、键大小、键值大小) 第一个大返回1,小返回-1,一样返回0
c++中map与dict的一点区别:c++中访问不存在的键则会默认设置为0;python中访问不存在的键会报错但是赋值不存在的键值是可以的。
五、yield
参考链接:https://blog.csdn.net/mieleizhi0522/article/details/82142856/ 博主讲的非常清晰幽默,此处仅做总结,详细查阅原博:
其与return有相似之处:遇到return之后返回,返回后程序不会再往下运行。遇到yield后,返回要生成的数,此步就结束。
与return的不同之处:带yield的函数是一个生成器,而不是一个函数了,这个生成器有一个函数就是next函数,next就相当于“下一步”生成哪个数,这一次的next开始的地方是接着上一次的next停止的地方执行的。
六、__init__.py,__all__的作用
参考链接:https://www.cnblogs.com/tp1226/p/8453854.html
总结概括一下:
__init__.py的这个文件作用是:(1)标识该目录是一个python的模块包。(2)使用它可以简化导入操作。如果没有该文件,目录底下的所有文件都需要一一导入。
可以在__init__.py中使用__all__变量关联要导入的子模块。
详细内容参阅上述参考链接。
七、uuid
参考链接:https://blog.csdn.net/d294083434/article/details/119671382
UUID(Universally Unique Identifier)是通用唯一识别码,在许多领域用作标识,比如我们常用的数据库也可以用它来作为主键,原理上它是可以对任何东西进行唯一的编码的。
在python中导入uuid这个模块,就可以使用它的四个方法了。注意这四个方法依次是uuid1(),uuid3(),uuid4(),uuid5(),没有uuid2()。
uuid1():这个是根据当前的时间戳和MAC地址生成的,最后的12个字符408d5c985711对应的就是MAC地址,因为是MAC地址,那么唯一性应该不用说了。但是生成后暴露了MAC地址这就很不好了。
uuid3():里面的namespace和具体的字符串都是我们指定的,然后呢···应该是通过MD5生成的,这个我们也很少用到,莫名其妙的感觉。
uuid4():这是基于随机数的uuid,既然是随机就有可能真的遇到相同的,但这就像中奖似的,几率超小,因为是随机而且使用还方便,所以使用这个的还是比较多的。
uuid5():这个看起来和uuid3()貌似并没有什么不同,写法一样,也是由用户来指定namespace和字符串,不过这里用的散列并不是MD5,而是SHA1.
八、可更改不可更改对象值传引用传
可更改(mutable)与不可更改(immutable)对象
在 python 中,strings, tuples, 和 numbers 是不可更改的对象,而 list,dict 等则是可以修改的对象。
不可变类型:变量赋值 a=5 后再赋值 a=10,这里实际是新生成一个 int 值对象 10,再让 a 指向它,而 5 被丢弃,不是改变a的值,相当于新生成了a。
可变类型:变量赋值 la=[1,2,3,4] 后再赋值 la[2]=5 则是将 list la 的第三个元素值更改,本身la没有动,只是其内部的一部分值被修改了。
python 函数的参数传递:
不可变类型:类似 c++ 的值传递,如 整数、字符串、元组。如fun(a),传递的只是a的值,没有影响a对象本身。比如在 fun(a)内部修改 a 的值,只是修改另一个复制的对象,不会影响 a 本身。
可变类型:类似 c++ 的引用传递,如 列表,字典。如 fun(la),则是将 la 真正的传过去,修改后fun外部的la也会受影响
python 中一切都是对象,严格意义我们不能说值传递还是引用传递,我们应该说传不可变对象和传可变对象。
九、在 python 中,类型属于对象,变量是没有类型的
a=[1,2,3]
a="Runoob"
以上代码中,[1,2,3] 是 List 类型,"Runoob" 是 String 类型,而变量 a 是没有类型,它仅仅是一个对象的引用(一个指针),可以是 List 类型对象,也可以指向 String 类型对象。
十、不定长参数
你可能需要一个函数能处理比当初声明时更多的参数。这些参数叫做不定长参数,和上述2种参数不同,声明时不会命名。
加了星号(*)的变量名会存放所有未命名的变量参数。选择不多传参数也可。如下实例:
#!/usr/bin/python
# -*- coding: UTF-8 -*-
# 可写函数说明
def printinfo( arg1, *vartuple ):
"打印任何传入的参数"
print "输出: "
print arg1
for var in vartuple:
print var
return;
# 调用printinfo 函数
printinfo( 10 );
printinfo( 70, 60, 50 );
输出:
10
输出:
70
60
50