本文原链接: https://blog.csdn.net/u013600415/article/details/104343705
Python3 Tips
Python3站点信息
命名空间
A namespace is a mapping from names to objects.Most namespaces are currently implemented as Python dictionaries.
命名空间是Python中的名称到对象的映射,大多数的命名空间用Python字典(dict)实现。
对象的创建过程
- 以Player类为例:
class Player(object):
def __new__(cls, *args, **kwargs):
print('Player实例创建完毕!')
return super().__new__(cls)
def __init__(self, playername, prefgame):
self.playername = playername
self.prefgame = prefgame
print('Player实例初始化完毕!')
def show(self):
print('我叫{},我更喜欢玩{}这款游戏!'.format(self.playername, self.prefgame))
if __name__ == '__main__':
p_0 = Player('茂名狙神', 'CS:GO')
p_0.show()
# 输出信息如下:
# Player实例创建完毕!
# Player实例初始化完毕!
# 我叫茂名狙神,我更喜欢玩CS:GO这款游戏!
- 事实上,创建一个对象分为两个步骤:
- Player调用__new__函数创建Player的对象实例
- Player调用__init__函数为刚刚创建的对象实例进行初始化工作
- 来自官方文档的解释:
Because __new__() and __init__() work together in constructing objects (__new__() to create it, and __init__() to customize it), no non-None value may be returned by __init__(); doing so will cause a TypeError to be raised at runtime.
因为对象是由__new__()与__init__()一起协同创建的(__new__()创建类的实例而__init__()则按照我们的需求完善实例),所以__init__()只能返回None,否则在运行时将会引发TypeError
*args 与 **kwargs 的作用
- *args表示接受任意个数(包括0)的只有参数值的参数传入,是一个元组(tuple)
def Pocket(content, *args):
print('args的类型是:{}'.format(type(args)))
out = '{}的配料有:'.format(content)
for obj in args:
out += str(obj) + ' '
print(out)
if __name__ == '__main__':
Pocket('小汉堡', '臭豆腐', '腐乳', '柠檬')
# 输出信息如下:
# args的类型是:<class 'tuple'>
# 小汉堡的配料有:臭豆腐 腐乳 柠檬
- *kwargs是关键字参数(Keyword args)的意思,表示接受任意个数(包括0)的带参数名称的参数传入,是一个字典(dict)
def SuperPocket(content, *args, **kwargs):
print('kwargs的类型是:{}'.format(type(kwargs)))
out = '口袋里有:{} '.format(content)
for obj in args:
out += str(obj) + ' '
out += '以及各种私货:{}'.format(kwargs)
print(out)
if __name__ == '__main__':
SuperPocket('烤面筋', '老干妈', '吃不饱的面条', gamedisc='R6', device='EDD')
# 输出信息如下:
# kwargs的类型是:<class 'dict'>
# 口袋里有:烤面筋 老干妈 吃不饱的面条 以及各种私货:{'gamedisc': 'R6', 'device': 'EDD'}
迭代器
多线程
部分内置函数
'''
Python3内置函数
'''
# abs()
print('-3.14的绝对值是:' , abs(-3.14))
# ascii()
dob_0 = 3.14159
ascii_0 = ascii(dob_0)
print('经过ascii函数转换后的对象类型是:', type(ascii_0), '内容是:', ascii_0)
str_0 = [[1, 'Hello'], ['Temp', 7.21], ['你好']]
ascii_1 = ascii(str_0)
print('经过ascii函数转换含有非ASCII编码的字符后的对象类型是:', type(ascii_1), '内容是:', ascii_1)
# bin()
print('bin函数将整数转换成其二进制形式的字符串:', bin(10))
# bool()
print('不给参数:', bool(), '给定表达式则输出其真值:', bool(3 < 4))
# callable(object) 测试object是否可调用
class CallableTestClass:
def __init__(self):
print('已创建CallableTest类')
def CallableTestFun():
print('已调用CallableTestFun函数')
print('数值,字符串,列表,元组皆不可调用:', callable(3.14), callable('Hello'), callable([3.14, ['Temp']]), callable((1, 2, 3)),
'类名与函数皆可调用:', callable(CallableTestClass), callable(CallableTestFun))
# chr() 返回 Unicode 码位为整数 i 的字符的字符串格式
print('百分号与一个HELLO:', chr(37), chr(72), chr(69), chr(76), chr(76), chr(79))
# @classmethod 装饰器
class People:
num = 0
def __init__(self, name, gender):
self.name = name
self.gender = gender
People.num += 1
def show(self):
print('这是一位名为{}的{}'.format(self.name, self.gender))
@staticmethod
def getshow():
return '人类是友善的,至少是大多数情况!目前人数: {}'.format(People.num)
@classmethod
def getnum(cls):
return cls.num
person_0 = People('Mick', 'Boy')
person_1 = People('Sick', 'Boy')
person_2 = People('Bavt', 'Girl')
print('上方定义了3个人, 使用类方法查看人数:', People.getnum(), '使用静态方法:', People.getshow())
# delattr() 删除对象的某个属性
'''
person_0.show()
delattr(person_0, 'name') # 跟这句是一样的:del person_0.name
person_0.show()
'''
# divmod(a, b) 返回元组(a // b, a % b)
print(divmod(7, 4))
# enumerate(iterable, start=0) 根据iterable中的序列或者是可迭代对象与序号绑定生成元组
word_0 = ['Ash', 'Buck', 'CDUA', 'Detector']
print(list(enumerate(word_0, 3)))
# eval(expression) eval将会把expression字符串当做python命令执行
eval('person_2.show()')