十八、内置函数

内置函数   

内置函数即安装python之后就已经存在的。本节我们就来学习这些函数以及用法

其实在我们之前的学习中。我们就已经接触了大量的内置函数。

一、前面的章节学习过或者比较简单的内置函数如下

# abs() 函数返回数字的绝对值。
print('abs(-45)的值:', abs(-45))

# bool() 函数用于将给定参数转换为布尔类型,如果没有参数,返回 False。
print(bool(0))  # 返回False

#hex() 函数将一个整数转换成十六进制字符串
print(hex(8)) # ox8

# classmethod 修饰符对应的函数不需要实例化,不需要 self 参数。(忘记用法的查看面向对象那节)

# complex() 函数用于创建一个复数。(数据类型转换学习过)

# dict() 函数用于创建一个字典。(数据类型转换学习过)

# float() 函数用于将整数和字符串转换成浮点数。(数据类型转换学习过)

#  input() 函数接受一个标准输入数据,返回为 string 类型

#  id() 函数用于获取对象的内存地址

# int() 把符合规则的对象转换成整数。(数据类型转换学习过)

# 匿名函数lambda:是指一类无需定义标识符(函数名)的函数或子程序。(自定义函数)

# max() 方法返回给定参数的最大值,参数可以为序列

# min() 方法返回给定参数的最小值,参数可以为序列

# pow(x, y[, z]) 函数是计算x的y次方,如果z在存在,则再对结果进行取模,其结果等效于pow(x,y) %z
# pow() 内置方法返回是整型  math.pow() 内置模块返回的是 flaot

# range() 函数可创建一个整数列表 

# round() 方法返回浮点数x的四舍五入值。

# set() 把符合规则的对象转换成集合 (数据类型转换学习过)

# staticmethod 返回函数的静态方法。(面向对象学习过)

# str() 把对象转换成字符串 (数据类型转换学习过)

# sum() 对可迭代的序列进行求和计算。第二个参数默认为0.如果自己设置。指序列计算和之后在加上设置的值
print(sum([2, 3, 4, 5, 6], 8))  # 列表计算总和后再加 2

# all() 函数用于判断给定的可迭代参数 iterable 中的所有元素是否都为 TRUE,如果是返回 True,否则返回 False。
# 元素除了是 0、空、FALSE 外都算 TRUE。
# 注意:空元组、空列表返回值为True,这里要特别注意。
print(all(['a', '']))  # 列表存在一个为空的元素,返回False

# any() 函数用于判断给定的可迭代参数 iterable 是否全部为 False,则返回 False,如果有一个为 
# True,则返回 True。
print(any(['a', 'b', 'c', '']))  # 列表存在一个为空的元素,返回True

# ascii() 函数类似 repr() 函数, 返回一个表示对象的字符串,
print(ascii('uiatfu'))

# bin() 将一个整数转化为一个二进制整数,并以字符串的类型返回。
print(bin(12))  # 输出12的二进制 0b1100

# type() 返回对象的数据类型

# oct() 函数将一个整数转换成八进制字符串
print(oct(3)) # 0o3

# ord() 函数是 chr() 函数(对于8位的ASCII字符串)或 unichr() 函数(对于Unicode对象)的配对函#数,它以一个字符(长度为1的字符串)作为参数,返回对应的 ASCII 数值,或者 Unicode 数值,如果所给#的 Unicode 字符超出了你的 Python 定义范围,则会引发一个 TypeError 的异常。

'''
chr(i) 查看十进制数对应的ASCII码值 用一个整数作参数,返回一个对应的字符。
i -- 可以是 10 进制也可以是 16 进制的形式的数字,数字范围为 0 到 1,114,111 (16 进制为0x10FFFF)。
返回值
返回值是当前整数对应的 ASCII 字符。
'''
print(chr(0x30))
print(chr(97))

# repr() 函数将对象转化为供解释器读取的形式
print(repr('测试')) # 测试

二、其他常见的内置函数

1、格式化字符串的函数str.format(),此函数可以快速处理各种字符串。用来替代我们之前学习过的%。这个内置函数在我们实际编程过程中用的频率非常高,场景如下。 

# 通过位置
print('{0},{1}'.format('test', 21))
print('{1},{0},{1}'.format('test', 22))

# 通过关键字参数
print('{demo},{test}'.format(test=18, demo='c'))


class Dem:
    def __init__(self, a, b):
        self.a = a
        self.b = b

    def __str__(self):
        return 'test,test, {self.a},~ {self.b} demo'.format(self=self)


# 通过映射 list
a_list = ['1', 2, '3']
print('test {0[0]}, {0[2]},demo {0[1]}'.format(a_list))

# 通过映射 dict
b_dict = {'test': '1', 'demo': 2, 'abc': '3'}
print('~~~ {test},  is {demo}, {abc}'.format(**b_dict))

# 填充与对齐
print('{:>8}'.format('100'))  #       100
print('{:0>8}'.format('100'))  # 00000100
print('{:a<8}'.format('100'))  # 100aaaaa

# 精度与类型f
# 保留两位小数
print('{:.2f}'.format(551.33234))  # 551.33

# 用来做金额的千位分隔符
print('{:,}'.format(1234567890))  # 1,234,567,890

# 其他类型 主要就是进制了,b、d、o、x分别是二进制、十进制、八进制、十六进制。

print('{:b}'.format(18))  # 二进制 10010
print('{:d}'.format(18))  # 十进制 18
print('{:o}'.format(18))  # 八进制 22
print('{:x}'.format(18))  # 十六进制12

2、map()是 Python内置的高阶函数,它接收一个函数和一个list,并通过把函数依次作用在list的每个元素上,得到一个新的list 并返回 

# 创建一个新列表。元素是原始列表元素的平方
list = [1, 2, 3, 4, 5]

def m(x):
    return x * x

list1 = map(m, list)
print(list1)


# 需求 用户输入的名字字母有大写小写。请把所有名字按照首子母大写剩余字母小写打印出来。
def name(s):
    mz = s[0:1].upper() + s[1:].lower()
    return mz

names = ['addqwm', 'LISA', 'baErT']
for i in map(name, names):
    print(i)

3、eval() 函数用来执行一个字符串表达式,并返回表达式的值。(eval函数还可以实现list、dict、tuple,set与str之间的转化.这个数据类型转换的时候学习过)

  •  语法:eval(expression[, globals[, locals]])

  • 参数:expression -- 表达式。globals -- 变量作用域,全局命名空间,如果被提供,则必须是一个字典对象。locals -- 变量作用域,局部命名空间,如果被提供,可以是任何映射对象。

  • 返回值:返回表达式计算结果。 

x = 2
print(eval('3*x'))
print(eval('pow(2,2)'))
print(eval('3+5'))

4、exec可以执行复杂的python代码,而不像eval函数那样只能计算一个表达式的值。

  • 语法:exec(source, globals=None, locals=None, /)

  • 参数:source:必选参数,表示需要被指定的python代码。它必须是字符串或code对象。如果source是一个字符串,该字符串会先被解析为一组python语句,然后执行。如果source是一个code对象,那么它只是被简单的执行。

eval()函数和exec()函数的区别:
eval()函数只能计算单个表达式的值,而exec()函数可以动态运行代码段。
eval()函数可以有返回值,而exec()函数返回值永远为None。 

x = 10

# 代码块
expr = """
z = 30
sum = x + y + z   
print(sum)
"""

def func():
    y = 20
    exec(expr)  
    exec(expr, {'x': 1, 'y': 2})  
    exec(expr, {'x': 1, 'y': 2}, {'y': 3, 'z': 4}) 

func()

 5、isinstance() 函数来判断一个对象是否是一个已知的类型,类似 type()。
      isinstance() 与 type() 区别:
      type() 不会认为子类是一种父类类型,不考虑继承关系。
     isinstance() 会认为子类是一种父类类型,考虑继承关系。
     如果要判断两个类型是否相同推荐使用 isinstance()。

  • 语法:isinstance(object, classinfo)

  • 参数:object -- 实例对象。classinfo -- 可以是直接或间接类名、基本类型或者有它们组成的元组。

  • 返回值:如果对象的类型与参数二的类型(classinfo)相同则返回 True,否则返回 False。

a = 2
print(isinstance(a, int))  # 返回 True
print(isinstance(a, str))  # 返回 Fasle
print(isinstance(a, (str, int, list)))  # 返回 True  是元组中的一个类型 就行


class A:
    pass

class B(A):
    pass

print(isinstance(A(), A))  # returns True
print(type(A()) == A)  # returns True
print(isinstance(B(), A))  # returns True
print(type(B()) == A)  # returns False

6、open() 函数用于打开一个文件,创建一个 file 对象,相关的方法才可以调用它进行读写。(不管这么操作。最后记的关闭文件)

  • 语法: open(name[, mode[, buffering]])

  • 参数说明:name : 一个包含了你要访问的文件名称的字符串值。mode : mode 决定了打开文件的模式:只读,写入,追加等。所有可取值见如下的完全列表。这个参数是非强制的,默认文件访问模式为只读(r)。buffering : 如果 buffering 的值被设为 0,就不会有寄存。如果 buffering 的值取 1,访问文件时会寄存行。如果将 buffering 的值设为大于 1 的整数,表明了这就是的寄存区的缓冲大小。如果取负值,寄存区的缓冲大小则为系统默认。

不同模式打开文件的功能不一致:
      r 以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。
      rb 以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。
      r+ 打开一个文件用于读写。文件指针将会放在文件的开头。
      rb+ 以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。
      w 打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
     wb以二进制格式打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
     w+ 打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
     wb+以二进制格式打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
    a 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
    ab 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
    a+ 打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。
    ab+ 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。

file对象常用方法。
file.read([size]):size 未指定则返回整个文件,如果文件大小 >2 倍内存则有问题,f.read()读到文件尾时返回""(空字串)。
file.readline():返回一行。
file.readlines([size]) :返回包含size行的列表, size 未指定则返回全部行。
for line in f: print line :通过迭代器访问。
f.write("hello\n"):如果要写入字符串以外的数据,先将他转换为字符串。
f.tell():返回一个整数,表示当前文件指针的位置(就是到文件头的比特数)。
f.seek(偏移量,[起始位置]):用来移动文件指针。
偏移量: 单位为比特,可正可负
起始位置: 0 - 文件头, 默认值; 1 - 当前位置; 2 - 文件尾
f.close() 关闭文件

f = open('1.txt', 'r')
print(f.read())
f.close()

f = open('1.txt', 'w')
f.write('2112')
f.close()

7、bytes 函数返回一个新的 bytes 对象,该对象是一个 0 <= x < 256 区间内的整数不可变序列。
语法:class bytes([source[, encoding[, errors]]])
参数:如果 source 为整数,则返回一个长度为 source 的初始化数组;
           如果 source 为字符串,则按照指定的 encoding 将字符串转换为字节序列;
           如果 source 为可迭代类型,则元素必须为[0 ,255] 中的整数;
           如果 source 为与 buffer 接口一致的对象,则此对象也可以被用于初始化 bytearray。
           如果没有输入任何参数,默认就是初始化数组为0个元素。
返回值:返回一个新的 bytes 对象。将一个字符串转换成字节类型。 

print(bytes('python3.7', encoding='utf-8'))
print(bytes('测试', encoding='utf-8'))

print(bytes([1, 2]))
print(bytes('test', 'ascii'))
print(type(bytes([1, 2, 3])))

8、dir() 函数不带参数时,返回当前范围内的变量、方法和定义的类型列表;
带参数时,返回参数的属性、方法列表。如果参数包含方法__dir__(),该方法将被调用。
如果参数不包含__dir__(),该方法将最大限度地收集参数信息。 

print(dir())  # 获得当前模块的属性列表
print(dir([]))  # 获得列表的方法
print(dir(str))  # 获得字符串的方法
print(dir(dict))  # 获得字典的方法

9、 getattr()函数用于返回一个对象属性值。

  • 语法:getattr(object,name,default)。

  • 参数:object--对象name--字符串,对象属性 default--默认返回值,如果不提供该参数,在没有对应属性时,将触发AttributeError。

  • 返回值: 返回对象属性值

class Demo():
    a = 1

obj = getattr(Demo, 'a')
print(obj)

10、 globals() 函数会以字典类型返回当前位置的全部全局变量

a = '我是其中一个全局变量'
print(globals())  # globals 函数返回一个全局变量的字典,包括所有导入的变量。

11、 hasattr()函数用于判断是否包含对应的属性。

  • 语法:hasattr(object,name)。

  • 参数:object--对象 name--字符串,属性名。

  • 返回值:如果对象有该属性返回True,否则返回False

class Demo():
    a = '1'

obj = Demo()
print(hasattr(Demo, 'a'))  # 输出 True

12、issubclass() 方法用于判断参数 class 是否是类型参数 classinfo 的子类。

  • 语法:issubclass(class, classinfo)

  • 参数:class -- 类。classinfo -- 类。

  • 返回值:如果 class 是 classinfo 的子类返回 True,否则返回 False。

class A:
    pass


class B(A):
    pass


class C(A):
    pass


print(issubclass(B, A))  # 返回 True
print(issubclass(C, A))  # 返回 True
print(issubclass(C, B))  # 返回 False

# class参数是classinfo的子类,并且classinfo是元组
print(issubclass(C, (A, object)))  # 返回  True
print(issubclass(C, (A, int, object)))  # 返回  True
print(issubclass(C, (int, str)))  # 返回 False
print(issubclass(C, (int, str, type)))  # 返回 False

13、 locals() 函数会以字典类型返回当前位置的全部局部变量。对于函数, 方法, lambda 函式, 类, 以及实现了 __call__ 方法的类实例, 它都返回 True。

  • 函数语法:locals()

  • 参数:无

  • 返回值:返回字典类型的局部变量

def test_py(arg):
    z = 1
    print(locals())

test_py(6)  # 输出 {'z': 1, 'arg': 6}


def foo(arg, a):
    x = 100
    y = 'hello python!'
    for i in range(10):
        j = 1
        k = i
    print(locals())


foo(1, 2)

14、setattr函数,用于设置属性值,该属性必须存在

  • 语法:setattr(object,name,value)

  • 参数:object--对象 name--字符串,对象属性value--属性值

  • 返回值:无 

lass People():
     pass

obj = People('zhangsan')
setattr(People, 'x', 123)
print(People.x)  # 等同于 Peopel.x=123

setattr(obj, 'age', 18)
print(obj.__dict__)

print(People.__dict__)

15、slice() 函数实现切片对象,主要用在切片操作函数里的参数传递。

  • 语法:class slice(stop) class slice(start, stop[, step])

  • 参数说明:start -- 起始位置 stop -- 结束位置 step -- 间距

  • 返回值:返回一个切片对象。 

myslice = slice(5)  # 设置一个 截取五个元素的切片
print(myslice)  # 输出 slice(None, 5, None)

arr = list(range(10))
print(arr)  # 输出 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
print(arr[myslice])  # 输出 [0, 1, 2, 3, 4]

print(arr[3:6])  # 输出 [3, 4, 5]

16、vars() 函数返回对象object的属性和属性值的字典对象。

  • 语法:vars([object])

  • 参数 object -- 对象

  • 返回值 返回对象object的属性和属性值的字典对象,如果没有参数,就打印当前调用位置的属性和属性值 类似 locals()。

print(vars())


# 输出 {'__name__': '__main__', '__doc__': '\n描述\nvars() 函数返回对象object的属性和属性值的字典对象。\n语法\nvars() 函数语法:\nvars([object])\n参数\nob

class A:
    a = 1
    __dict__ = 'ltf'


print(vars(A))
# 输出 {'__module__': '__main__', 'a': 1, '__dict__': <attribute '__dict__' of 'A' objects>, '__weakref__': <attribute '__weakref__' of 'A' objects>, '__doc__': None}

a = A()
print(vars(a))
# 输出 ltf

print(a.__dict__)
# 输出 ltf

17、zip函数接受任意多个可迭代对象作为参数,将对象中对应的元素打包成一个tuple,然后返回一个可迭代的zip对象.这个可迭代对象可以使用循环的方式列出其元素。若多个可迭代对象的长度不一致,则所返回的列表与长度最短的可迭代对象相同。

# 1.用列表生成zip对象
x = [1, 2, 3]
y = [4, 5, 6]
z = [7, 8, 9]
h = ['a', 'b', 'c', 'd']
zip1 = zip(x, y, z)
print(zip1)
for i in zip1:
    print(i)

zip2 = zip(x, y, h)
for i in zip2:
    print(i)

zip3 = zip(h)
for i in zip3:
    print(i)

zip4 = zip(*h * 3)
for i in zip4:
    print(i)  # 这是干啥哟。。

print('==*==' * 10)
# 2.二维矩阵变换
l1 = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
print(l1)
print([[j[i] for j in l1] for i in range(len(l1[0]))])
zip5 = zip(*l1)
for i in zip5:
    print(i)

18、 sorted() 函数对所有可迭代的对象进行排序操作。
        sort 与 sorted 区别:sort 是应用在 list 上的方法,sorted 可以对所有可迭代的对象进行排序操作。list 的 sort 方法返回的是对已经存在的列表进行操作,而内建函数 sorted 方法返回的是一个新的 list,而不是在原来的基础上进行的操作。

  • 语法:sorted(iterable, key=None, reverse=False)

  • 参数说明:iterable -- 可迭代对象。key -- 主要是用来进行比较的元素,只有一个参数,具体的函数的参数就是取自于可迭代对象中,指定可迭代对象中的一个元素来进行排序。reverse -- 排序规则,reverse = True 降序 , reverse = False 升序(默认)。

  • 返回值:返回重新排序的列表

print(sorted([2, 3, 4, 1, 5, 6]))  # 输出 [1, 2, 3, 4, 5, 6]

# 另一个区别在于list.sort() 方法只为 list 定义。而 sorted() 函数可以接收任何的 iterable。
print(sorted({1: 'D', 2: 'B', 3: 'B', 4: 'E', 5: 'A'}))  # 输出  [1, 2, 3, 4, 5]

# 利用key进行倒序排序
example_list = [5, 0, 6, 1, 2, 7, 3, 4]
result_list = sorted(example_list, key=lambda x: x * -1)
print(result_list)  # 输出  [7, 6, 5, 4, 3, 2, 1, 0]

# 要进行反向排序,也通过传入第三个参数 reverse=True:
example_list = [5, 0, 6, 1, 2, 7, 3, 4]
result_list = sorted(example_list, reverse=True)
print(result_list)  # 输出 [7, 6, 5, 4, 3, 2, 1, 0]

# sorted 的应用,也可以通过 key 的值来进行数组/字典的排序,比如
array = [{"age": 20, "name": "a"}, {"age": 25, "name": "b"}, {"age": 10, "name": "c"}]
array = sorted(array, key=lambda x: x["age"])
print(array)  # 输出 [{'age': 10, 'name': 'c'}, {'age': 20, 'name': 'a'}, {'age': 25, 'name': 'b'}]

19、complie()将字符串编译成python能识别或可以执行的代码,也可以将文字读成字符串再编译语法:compile(source, filename, mode, flags=0, dont_inherit=False, optimize=-1)
将source编译为代码或者AST对象。代码对象能过通过exec语句来执行或者eval()进行求值。
参数source:字符串或者AST(abstract syntax trees)对象。
参数filename:代码文件名称,如果不是从文件读取代码则传递一些可辨认的值。
参数model:指定编译代码的种类。可以指定'exec', 'eval', 'single'。
参数flag和dont_inherit:这两个参数为可选参数

s = "print('hello world')"
r = compile(s, 'hello', 'exec')
print(r)

'''
delattr函数用于删除属性 setattr(object,name) 参数:类名,属性名
'''


class Demo():
    a = 1
    b = 2


# 这两种都可以删除对象的属性
delattr(Demo, 'a')
del Demo.b











20、enumerate是翻译过来是枚举的意思,看下它的方法原型:
enumerate(sequence, start=0),返回一个枚举对象。
sequence必须是序列或迭代器iterator,或者支持迭代的对象。
enumerate()返回对象的每个元素都是一个元组,
每个元组包括两个值,一个是计数,一个是sequence的值,
计数是从start开始的,start默认为0。
 

a = ["q", "w", "e", "r"]
c = enumerate(a)
for i in c:
    print(i)

'''
输出如下:
(0, 'q')
(1, 'w')
(2, 'e')
(3, 'r')
'''

a = ["w", "a", "s", "d"]
# 这里加了个参数2,代表的是start的值
c = enumerate(a, 2)
for i in c:
    print(i)


21、filter() 函数是一个对于可迭代对象的过滤器,过滤掉不符合条件的元素,
返回的是一个迭代器,如果要转换为列表,可以使用 list() 来转换。
该函数接收两个参数,第一个为函数的引用或者None,第二个为可迭代对象,
可迭代对象中的每个元素作为参数传递给函数进行判,然后返回 True 或 False,最后将返回 True 的元素放到迭代器中
下面看下fiter()的用法:
 

my_list = [1, 2, '', 3, 4, '6', ' ']
new_list = list(filter(None, my_list))
print(new_list)


# None 函数 过滤掉'' 而不是过滤掉空字符串

def is_oushu(x):
    return x % 2 == 0


new_list = list(filter(is_oushu, list(range(1, 11))))
print(new_list)
# 过滤掉不是偶数的数

a = [1, 2, 3, 4, 5, 6, 2, 2, 2, ]
print(list(filter(lambda x: x != 2, a)))


22、hash() 用于获取取一个对象(字符串或者数值等)的哈希值。
 语法:hash(object)
参数说明:object -- 对象;
返回值:返回对象的哈希值。
hash() 函数可以应用于数字、字符串和对象,不能直接应用于 list、set、dictionary。
在 hash() 对对象使用时,所得的结果不仅和对象的内容有关,还和对象的 id(),也就是内存地址有关。

hash() 函数的用途
hash() 函数的对象字符不管有多长,返回的 hash 值都是固定长度的,
也用于校验程序在传输过程中是否被第三方(木马)修改,
如果程序(字符)在传输过程中被修改hash值即发生变化,
如果没有被修改,则 hash 值和原始的 hash 值吻合,
只要验证 hash 值是否匹配即可验证程序是否带木马(病毒)。

print(hash('test'))  # 输出 -2950866779904704330   会改变的
print(hash(1))  # 数字  输出 1
print(hash(str([1, 2, 3])))  # 集合   输出 -6217131644886971364
print(hash(str(sorted({'1': 1}))))  # 字典   输出 -6233802074491902648


class Test:
    def __init__(self, i):
        self.i = i


for i in range(10):
    t = Test(1)
    print(hash(t), id(t))

name1 = '正常程序代码'
name2 = '正常程序代码带病毒'
print(hash(name1))  # 2403189487915500087
print(hash(name2))  # -8751655075885266653


23、iter() 函数用来生成迭代器。

  • 语法:iter(object[, sentinel])

  • 参数:object -- 支持迭代的集合对象。sentinel -- 如果传递了第二个参数,则参数 object 必须是一个可调用的对象(如,函数),此时,iter 创建了一个迭代器对象,每次调用这个迭代器对象的__next__()方法时,都会调用 object。

  • 返回值:迭代器对象。

1 iter(o[, sentinel])
2 返回一个iterator对象。该函数对于第一个参数的解析依赖于第二个参数。
3 如果没有提供第二个参数,参数o必须是一个集合对象,支持遍历功能(__iter__()方法)或支持序列功能(__getitem__()方法),
4 参数为整数,从零开始。如果不支持这两种功能,将处罚TypeError异常。
5 如果提供了第二个参数,参数o必须是一个可调用对象。在这种情况下创建一个iterator对象,每次调用iterator的next()方法来无
6 参数的调用o,如果返回值等于参数sentinel,触发StopIteration异常,否则将返回该值。
 

lst = [1, 2, 3, 4, 5, 6, 7]
for i in iter(lst):
    print(i)  # 输出1,2,3,4,5,6,7


class counter:
    def __init__(self, _start, _end):
        self.start = _start
        self.end = _end

    def get_next(self):
        s = self.start
        if (self.start < self.end):
            self.start += 1
        else:
            raise StopIteration
        return s


c = counter(1, 5)
iterator = iter(c.get_next, 3)
print(type(iterator))  # 返回 <class 'callable_iterator'>
for i in iterator:
    print(i)  # 输出 1  2


24、next() 返回迭代器的下一个项目。
语法:next(iterator[, default])
参数说明:iterator -- 可迭代对象,default -- 可选,用于设置在没有下一个元素时返回该默认值,如果不设置,又没有下一个元素则会触发 StopIteration 异常。
返回值:返回对象帮助信息。
 

# 首先获得Iterator对象:
it = iter([1, 2, 3, 4, 5])
# 循环:
while True:
    try:
        # 获得下一个值:
        x = next(it)
        print(x)
    except StopIteration:
        # 遇到StopIteration就退出循环
        break

a = iter('abcde')
print(next(a))  # 输出 a
print(next(a))  # 输出 b
print(next(a))  # 输出 c
print(next(a))  # 输出 d
print(next(a))  # 输出 e
# print(next(a))    #报错 StopIteration

# 函数可以接收一个可选的default参数,传入default参数后,
# 如果可迭代对象还有元素没有返回,则依次返回其元素值,如果所有元素已经返回,
# 则返回default指定的默认值而不抛出StopIteration 异常。

print(next(a, 'e'))  # 这次不报错了 返回 e 即default参数


25、reversed 函数返回一个反转的迭代器。

语法:reversed(seq)
参数:seq -- 要转换的序列,可以是 tuple, string, list 或 range。
返回值:返回一个反转的迭代器。

1 reversed(seq)
2 返回一个逆序的iterator对象。参数seq必须是一个包含__reversed__()方法的对象或支持序列操作(__len__()和__getitem__())
3 该函数是2.4中新增的
 

str = 'wasdqwer'
print(list(reversed(str)))  # 输出 ['r', 'e', 'w', 'q', 'd', 's', 'a', 'w']

tuple = ('r', 'e', 'w', 'q', 'd', 's', 'a', 'w')
print(list(reversed(tuple)))  # 输出 ['w', 'a', 's', 'd', 'q', 'w', 'e', 'r']

seqRange = range(5, 9)
print(list(reversed(seqRange)))  # 输出 [8, 7, 6, 5]

seqList = [1, 2, 4, 3, 5]
print(list(reversed(seqList)))  # 输出 [5, 3, 4, 2, 1]

a = [1, 2, 3, 4, 5, 6]
b = reversed(a)
print(b)  # 输出  <list_reverseiterator object at 0x0000023E2A448748>  显示为一个迭代器
print(list(b))  # 输出  [6, 5, 4, 3, 2, 1]
print(list(b))  # 输出  []

# 由此可知:reversed()返回的是一个迭代器对象,只能进行一次循环遍历。显示一次所包含的值!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Bug来袭~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值