3-7python语法基础-函数-内置函数-python39共69个内置函数,反射
####
内置函数
内置函数在python官方文档有明确的列表,
https://docs.python.org/zh-cn/3/library/functions.html
python3.9已经有69个内置函数了,
内置函数和异常 --- 不需要 import 语句就可以在所有Python代码中使用的对象。
###
在ipyhon解释器可以通过命令:dir(__builtin__)
查看到所有的内置常量和内置变量,
开头字母大写的就是内置常量,
###
我们经常使用help(),dir(),print()都是内置函数,和帮助文档有关,
还有我们经常使用的id(),type()都是内置函数,
还有我们经常使用int(),str(),float(),bool(),list(),tuple(),set(),dict(),和数据类型有关,complex()这个是复数,用的不多,
还有我们经常使用的,sum(),max(),min(),和数字有关系的,pow()这个是幂运算,比如pow(3,3)=27,abs(),round(),divmod()
还有我们经常使用的,setattr(),getattr(),delattr(),hasattr(),这是和反射有关系的
上面这些都不需要学习,你自己都知道了,
####
还有很多高级的内置函数,你需要细细揣摩的,
有时候这些内置函数的用途,是非常的神奇的,
####
""" 一共是 68个内置函数: 反射相关的内置函数4个: setattr() delattr() hasattr() getattr() 和作用域相关的两个: globals() locals() 数据结构相关的: set() list() dict() int() float() tuple() bool() complex() 和字符串相关的: str() format() bytes() bytearray() memoryview() repr() chr() ascii() ord() 和数学运算相关的 max() pow() sum() abs() min() round() divmod() 和进制转换相关的: oct() hex() bin() 和字符串执行相关的: eval() exec() compile() 和迭代器相关的: next() iter() 面向对象相关的: object() super() classmethod() staticmethod() issubclass() property() 和处理序列相关的函数: 1,enumerate() 枚举 2,isinstance() 判断是否是某一种数据类型 3,filter() 对序列进行过滤,返回一个列表, 4,map() 对序列进行映射,返回一个可迭代对象, 5,zip() 这是把两个序列,对应的元素合并成为一个元组,然后以列表的格式返回, 6,any() 函数用于判断给定的可迭代参数 iterable 是否全部为 False,则返回 False,如果有一个为 True,则返回 True。 7,all() 函数用于判断给定的可迭代参数 iterable 中的所有元素是否都为 TRUE,如果是返回 True,否则返回 False。 8,len() 方法返回对象(字符、列表、元组等)长度或项目个数。 9,sorted() """
特别的几个内置函数
特别内置函数1:callable
# callable() 函数用于检查一个对象是否是可调用的。 # 如果返回 True,object 仍然可能调用失败;但如果返回 False,调用对象 object 绝对不会成功。 # 对于函数、方法、lambda 函式、 类以及实现了 __call__ 方法的类实例, 它都返回 True。 # 语法 # callable(object) callable(0) # false ############## def add(a, b): return a + b callable(add) # true ################## class A: def method(self): return 0 callable(A) # true ################ a = A() callable(a) # 没有实现 __call__, 返回 False ############## class B: def __call__(self): return 0 callable(B) # true b = B() callable(b) # 实现 __call__, 返回 True ################
用途:
这个我其实很怀疑,具体在什么场景会用到这个内置函数,
特别内置函数2:enumerate 枚举 读音:英[ɪˈnjuːməreɪt]
""" enumerate() 函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中。 语法:enumerate(sequence, [start=0]) sequence -- 一个序列、迭代器或其他支持迭代对象。start -- 下标起始位置。 """ seasons = ['Spring', 'Summer', 'Fall', 'Winter'] print(list(enumerate(seasons))) # [(0, 'Spring'), (1, 'Summer'), (2, 'Fall'), (3, 'Winter')] print(list(enumerate(seasons, start=1))) # 下标从 1 开始 # [(1, 'Spring'), (2, 'Summer'), (3, 'Fall'), (4, 'Winter')] # 使用for循环: seq = ['one', 'two', 'three'] for i, element in enumerate(seq): print(i, element) # 0 one # 1 two # 2 three
特别内置函数3:isinstance()
""" isinstance() 函数来判断一个对象是否是一个已知的类型,类似 type()。 如果要判断两个类型是否相同推荐使用 isinstance()。 语法:isinstance(object, classinfo) object -- 实例对象。 classinfo -- 可以是直接或间接类名、基本类型或者由它们组成的元组。 """ a = 2 print(isinstance (a,int)) # True print(isinstance (a,str)) # False print(isinstance (a,(str,int,list))) # 是元组中的一个返回 True # True # isinstance() 与 type() 区别: # type() 不会认为子类是一种父类类型,不考虑继承关系。 # isinstance() 会认为子类是一种父类类型,考虑继承关系。 class A: pass class B(A): pass print(isinstance(A(), A)) # True print(type(A()) == A) # True print(isinstance(B(), A)) # True print(type(B()) == A) # False
特别内置函数4:filter() 过滤
""" filter() 函数用于过滤序列,过滤掉不符合条件的元素,返回由符合条件元素组成的新列表。 该接收两个参数,第一个为函数,第二个为序列,序列的每个元素作为参数传递给函数进行判断, 然后返回 True 或 False,最后将返回 True 的元素放到新列表中。 语法:filter(function, iterable) """
例题:
# filter方法求出列表所有奇数并构造新列表,a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] def is_odd(n): return n % 2 == 1 # 为什么这么写,就是因为除以2 有余数,要么是余数0,就是偶数,要么是余数1,就是奇数,只有这两种情况, tmplist = filter(is_odd, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]) newlist = list(tmplist) print(newlist) # 过滤出1~100中平方根是整数的数: import math def is_sqr(x): # 这是开根号, return math.sqrt(x) % 1 == 0 # 所有的整数的余数都是0,所以使用这个方法 tmplist = filter(is_sqr, range(1, 101)) newlist = list(tmplist) print(newlist) # [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
特别内置函数5:map() 映射
""" map() 会根据提供的函数对指定序列做映射。 第一个参数 function 以参数序列中的每一个元素调用 function 函数,返回包含每次 function 函数返回值的迭代器, 语法:map(function, iterable, ...) function -- 函数 iterable -- 一个或多个序列 Python 2.x 返回列表。 Python 3.x 返回迭代器。 所以这个map和for循环一起使用,而且还可以和匿名函数一起使用, """
例题:
# 列表[1,2,3,4,5],请使用map()函数输出[1,4,9,16,25],并使用列表推导式提取出大于10的数,最终输出[16,25] list1 =[1,2,3,4,5] # 第一种方式: def func(x): return x**2 ret = map(func,list1) print([i for i in ret if i>10]) # 第二种方式 ret = map(lambda x : x**2,list1) print([i for i in ret if i>10]) # 提供了两个列表,对相同位置的列表数据进行相加 ret =map(lambda x, y: x + y, [1, 3, 5, 7, 9], [2, 4, 6, 8, 10]) print([i for i in ret]) #[3, 7, 11, 15, 19]
个人分析:
针对filter和map,这两个都是对迭代对象的操作,一个过滤,一个映射,
这个结合匿名函数使用,会让代码更加的简洁,但是这么写不利于阅读,而且使用for循环也是可以实现,
我想不到有什么场景会使用这两个函数会比for循环更好,
特别内置函数6:zip()
""" zip() 函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的对象 我们可以使用 list() 转换来输出列表。 如果各个迭代器的元素个数不一致,则返回列表长度与最短的对象相同,利用 * 号操作符,可以将元组解压为列表。 语法:zip([iterable, ...]) iterabl -- 一个或多个迭代器; """ a = [1,2,3] b = [4,5,6] zipped = zip(a,b) # 返回一个对象 print(zipped) # <zip object at 0x103abc288> print(list(zipped)) # list() 转换为列表 [(1, 4), (2, 5), (3, 6)] a1, a2 = zip(*zip(a,b)) # 与 zip 相反,zip(*) 可理解为解压,返回二维矩阵式 print(list(a1)) # [1, 2, 3] print(list(a2)) # [4, 5, 6]
特别内置函数7:反射,setattr() delattr() hasattr() getattr()
""" 反射: 什么是反射 反射是一个很重要的概念,它可以把字符串映射到实例的变量或者实例的方法然后可以去执行调用、修改等操作。它有四个重要的方法: getattr 获取指定字符串名称的对象属性 setattr 为对象设置一个对象 hasattr 判断对象是否有对应的对象(字符串) delattr 删除指定属性 attr是属性英文的前几个字母,属性指的是类中类变量、实例变量和方法。但是要注意不能是私有的,如果你的变量是以“_”开头,那将无法获取。 反射常常用在动态加载模块的场景中。 """ """ getattr() 函数: getattr() 函数用于返回一个对象属性值。 getattr(object, name[, default]) object -- 对象。name -- 字符串,对象属性。 default -- 默认返回值,如果不提供该参数,在没有对应属性时,将触发 AttributeError hasattr() 函数用于判断对象是否包含对应的属性。 hasattr(object, name) object -- 对象。 name -- 字符串,属性名。 如果对象有该属性返回 True,否则返回 False。 setattr(object, name, value) setattr() 函数对应函数 getattr(),用于设置属性值,该属性不一定是存在的。 object -- 对象。name -- 字符串,对象属性。value -- 属性值。 delattr 函数用于删除属性。 语法:delattr(object, name) -- 对象 name -- 必须是对象的属性。 delattr(x, 'foobar') 相等于 del x.foobar。object """ class A(object): bar = 1 def show(self): print("这是一个普通方法") @classmethod def dance(cls): print("这是一个类方法") a = A() print(getattr(A, 'bar')) # 获取属性 bar 值 1 print(getattr(a, 'bar')) # 获取属性 bar 值 1 ret = getattr(A,"dance") print(ret) # <bound method A.dance of <class '__main__.A'>>,这是一个地址, ret() # 加上括号就运行了, """ 这就是反射: 1,通过一个字符串获取到了属性的值, 2,通过字符串拿到了函数地址,然后加括号就调用了, """ # getattr(a, 'bar2') # 属性 bar2 不存在,触发异常,报错 # getattr(a, 'bar2', 3) # 属性 bar2 不存在,但设置了默认值 # 所以需要和hasattr进行配合使用,先判断是否有,然后再使用getattr if hasattr(a, 'bar2'): getattr(a, 'bar2')
###
特别内置函数8:range,很重要,很常用!
range函数的用法: range(start, stop [,step]) 参数说明: start: 计数从 start 开始。默认是从 0 开始。例如range(5)等价于range(0, 5); stop: 计数到 stop 结束,但不包括 stop。例如:range(0, 5) 是[0, 1, 2, 3, 4]没有5 step:步长,默认为1。例如:range(0, 5) 等价于 range(0, 5, 1) Python3.x 中 range() 函数返回的结果是一个整数序列的对象,而不是列表。 用法: >>>range(5) range(0, 5) >>> for i in range(5): ... print(i) ... 0 1 2 3 4 >>> list(range(5)) [0, 1, 2, 3, 4] ####### >>> type(range(10)) <class 'range'> 当你 help(range) 时会看到: Return an object... 所以,不是列表,但是可以利用 list 函数返回列表,即: >>> list(range(10)) [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
#####
特别内置函数9:globals(), locals()
利用命名空间动态定义变量 首先创建locals()的副本 names = locals() for i in range(5): names['x' + str(i)] = i + 1 print(names["x1"])
#########################################
1、一行代码实现1--100之和 利用sum()函数求和 sum(range(1,101)) # 5050
#########################################
2、如何在一个函数内部修改全局变量 利用global在函数声明 修改全局变量 a = 5 def func(): global a a = 10 func() print(a)
#########################################
#########################################