1.56 函数setattr()
在Python程序中,使用函数setattr()的语法格式如下所示。
setattr(object, name, value)
- object:对象;
- name:字符串,表示对象属性。字符串可以是一个已存在属性的名字,也可以是一个新属性的名字;
- value:属性值。
函数setattr()对应于函数 getatt(),功能是设置属性值,该属性是必须存在。例如在下面的实例文件setattr.py中,演示了使用函数setattr()设置指定属性值的过程。
#函数有3个参数,功能是对参数object对象,设置名为name的属性的属性值为value值。
class Student:
def __init__(self,name):
self.name = name
a = Student('Kim')
print(a.name)
setattr(a,'name','Bob')
print(a.name)
#属性name可以是object对象的一个已经存在的属性,存在的话就会更新其属性值;如果name属性不存在,
# 则对象将创建name名称的属性值,并存储value值,等效于调用object.name = value。
#print(a.age )# 这是不存在age属性,执行后会出错
setattr(a,'age',10)# 执行后会创建 age属性
print(a.age)# 存在age属性了
a.age = 12 # 等效于调用object.name
print(a.age)
执行后会输出:
Kim
Bob
10
12
1.57 函数slice()
在Python程序中,使用函数slice()的语法格式如下所示。
class slice(stop)
class slice(start, stop[, step])
- start:起始位置;
- stop:结束位置;
- step:间距。
函数slice()的功能是实现切片对象,主要用在切片操作函数里的参数传递操作。函数slice()能够返回一个slice对象,表示由索引range(start, stop, step)指出的集合。参数start和参数step默认为None。切片对象具有只读属性start、stop和step,它们仅仅返回参数的值(或者它们的默认值)。他们没有其他明确的功能;但是它们被数字Python和其他第三方扩展使用。在使用扩展的索引语法时同样会生成切片对象。例如:a[start:stop:step]或者a[start:stop, i]。
例如在下面的实例文件slice.py中,演示了使用函数slice()返回一个反转的迭代器的过程。
#切片对象由3个属性start、stop、step组成,start和step默认值为None。
#切片对象主要用于对序列对象进行切片取对应元素。
a = list(range(10))
print(a)
print(a[None:5:None])# start step显式为None
print(a[:5:])# start step默认为None
print(a[2:5:None])# step显式为None
print(a[2:5:])# step默认为None
print(a[1:10:3])
#对应切片对象的3个属性start、stop、step,slice函数也有3个对应的参数start、stop、step,
#其值分别会付给切片对象的start、stop、step。
c1 = slice(5) # 定义c1
print(c1)
c2 = slice(2,5) # 定义c2
print(c2)
c3 = slice(1,10,3) # 定义c3
print(c3)
print(a[c1])# 和a[:5:]结果相同
print(a[c2])# 和a[2:5:]结果相同
print(a[c3])# 和a[1:10:3]结果相同
执行后会输出:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[0, 1, 2, 3, 4]
[0, 1, 2, 3, 4]
[2, 3, 4]
[2, 3, 4]
[1, 4, 7]
slice(None, 5, None)
slice(2, 5, None)
slice(1, 10, 3)
[0, 1, 2, 3, 4]
[2, 3, 4]
[1, 4, 7]
1.58 函数sorted()
在Python程序中,使用函数sorted()的语法格式如下所示。
sorted(iterable, key=None, reverse=False)
- iterable:可迭代对象;
- key:一个带有一个参数的函数,用于从列表的每个元素中提取比较的关键字:key=str.lower。默认值是None(直接比较元素)。指定可迭代对象中的一个元素来进行排序;
- reverse:排序规则,是一个布尔值。如果设置为True,那么列表中元素反过来比较来排序。reverse = True时表示降序,reverse = False(默认)时表示升序。
函数sorted()的功能是对所有可迭代的对象进行排序操作,与函数sort()的区别如下所示:
- 函数sort()是应用在 list 上的方法,函数sorted()可以对所有可迭代的对象进行排序操作;
- list的sort()函数返回的是对已经存在的列表进行操作,而内建函数sorted()返回的是一个新的list,而不是在原来的基础上进行的操作。
例如在下面的实例文件sorted.py中,演示了使用函数sorted()行排序操作所有可迭代对象进的过程。
#对一个可迭代对象进行排序,返回一个排序后列表。
a = sorted('dcabegf')
print(a)# 返回结果是列表
a = ['a','b','d','c','B','A']
print(a)
print(sorted(a))# 默认按字符ascii码排序
print(sorted(a,key = str.lower))# 转换成小写后再排序,'a'和'A'值一样,'b'和'B'值一样
#调用函数sorted时可以提供一个可选的命名参数reverse,它的默认值是False,用来排序结果是否倒转。
a = sorted('dcabegf')
print(a)
a = sorted('dcabegf',reverse = True) # 排序结果倒置
print(a)
执行后会输出:
['a', 'b', 'c', 'd', 'e', 'f', 'g']
['a', 'b', 'd', 'c', 'B', 'A']
['A', 'B', 'a', 'b', 'c', 'd']
['a', 'A', 'b', 'B', 'c', 'd']
['a', 'b', 'c', 'd', 'e', 'f', 'g']
['g', 'f', 'e', 'd', 'c', 'b', 'a']
1.59 函数staticmethod()
在Python程序中,使用函数staticmethod()的语法格式如下所示。
staticmethod(function)
函数staticmethod()的功能是返回function的一个静态方法,静态方法不接受隐式的第一个参数(也就是实例名称self)。要想声明静态方法,请使用下面的习惯方式:
class C:
@staticmethod
def f(arg1, arg2, ...): ...
@staticmethod形式是一个函数装饰器,可以在类(如C.f())或实例(如C().f())中调用。除了它的类型,实例其他的内容都被忽略。
例如在下面的实例文件staticmethod.py中,演示了使用装饰器@staticmethod的过程。
class C(object):
@staticmethod
def f():
print('toppr');
C.f(); # 静态方法无需实例化
cobj = C()
cobj.f() # 也可以实例化后调用
#类中普通的方法,实际上既可以被类直接调用也可以被类的实例对象调用,但是被实例对象调用的时候,
#要求方法至少有一个参数,而且调用时会将实例对象本身传给第一个参数。
class Student(object):
def __init__(self, name):
self.name = name
def sayHello(lang):
print(lang)
if lang == 'en':
print('Welcome!')
else:
print('你好!')
Student.sayHello
a = Student('Bob')
print(a.sayHello)
Student.sayHello
Student.sayHello('en') # 类调用的时候,将'en'传给了lang参数
a.sayHello() # 类实例对象调用的时候,将对象本身自动传给了lang参数,不能再接收参数
#a.sayHello('en')#运行这行代码会出错
#staticmethod函数功能就是将一个方法定义成类的静态方法,正确的方法是使用 @staticmethod装饰器,
#这样在实例对象调用的时候,不会把实例对象本身传入静态方法的第一个参数了。
# 使用装饰器定义静态方法
class Student(object):
def __init__(self,name):
self.name = name
@staticmethod
def sayHello(lang):
print(lang)
if lang == 'en':
print('Welcome!')
else:
print('你好!')
Student.sayHello('en') #类调用,'en'传给了lang参数
b = Student('Kim') #类实例对象调用,不再将类实例对象传入静态方法
#b.sayHello()#运行这行代码会出错
b.sayHello('zh') #类实例对象调用,'zh'传给了lang参数
执行后会输出:
toppr
toppr
<bound method Student.sayHello of <__main__.Student object at 0x0000018E0FF87710>>
en
Welcome!
<__main__.Student object at 0x0000018E0FF87710>
你好!
en
Welcome!
zh
你好!
1.60 函数str()
在Python程序中,使用函数str()的语法格式如下所示。
class str(object='')
class str(object=b'', encoding='utf-8', errors='strict')
函数str()的功能是返回object的str版本,参数str是一个内置字符串类。
例如在下面的实例文件str.py中,演示了使用函数str()将对象转换成其字符串表的过程。
#将对象转换成其字符串表现形式,如果不传入参数,将返回空字符串。
print(str())
print(str(None))
print(str('abc'))
print(str(123))
#当转换二进制流时,可以传入参数encoding,表示读取字节数组所使用的编码格式;
#参数errors,表示读取二进制的错误级别。(这两个参数和open方法中的同名参数有相同取值和类似的含义
file = open('test.txt','rb') # 打开文件
fileBytes = file.read() # 读取二进制流
print(fileBytes)
print(str(fileBytes)) # 默认将二进制流转换成字符串表现形式
print(str(fileBytes,'utf-8')) # 传入encoding参数,函数将以此编码读取二进制流的内容
print(str(fileBytes,'gbk')) # 当传入encoding不能解码时,会报错(即errors参数默认为strict)
print(str(fileBytes,'gbk','ignore')) # 'ignore' 忽略级别,字符编码有错,忽略掉
print(str(fileBytes,'gbk','replace')) # 'replace' 替换级别,字符编码有错的,替换成?.