Python基础-内置函数&关键字(笔记)
Python基础-内置函数&关键字
- abs() - 求绝对值
- all() - 元素都为真
- any() - 元素至少一个为真
- ascii() - 展示对象
- bin() - 十进制转二进制
- oct() - 十进制转八进制
- hex() - 十进制转十六进制
- bool() - 布尔判断
- bytes() - 字符串转字节
- str() - 转为字符串
- callable() - 是否可调用
- chr() - 十进制转ASCII字符
- ord() - ASCII字符转十进制
- classmethod - 类方法
- compile() - 执行字符串表示的代码
- complex() - 创建复数
- delattr() - 动态删除属性
- dict() - 转为字典
- dir() - 一键查看对象所有方法
- divmod() - 取商和余数
- enumerate() - 枚举对象
- eval() - 计算表达式
- getsizeof() - 查看变量所占字节数
- filter() - 过滤器
- float() - 转为浮点数
- format() - 字符串格式化
- frozenset() - 创建一个不可修改的集合
- getattr() - 动态获取对象属性
- hasattr() - 判断对象是否有这个属性
- hash() - 返回对象的哈希值
- help() - 一键帮助
- id() - 返回对象的内存地址
- input() - 获取用户输入
- int() - 转为整数
- isinstance() - 判断对象是否是类的实例
- issubclass() - 父子类关系鉴定
- iter() - 创建迭代器
- object() - 所有类的基类
- open() - 打开文件
- pow() - 次幂
- print() - 打印
- property() - 创建属性
- range() - 创建序列
- reversed() - 反向迭代
- round() - 四舍五入
- set() - 转为集合类型
- slice() - 转为切片对象
- sorted() - 排序函数
- sum() - 求和函数
- tuple() - 转元组
- type() - 查看对象类型
- zip() - 聚合迭代器
- nonlocal - 声明变量用于内嵌函数中
- global - 声明为全局变量
abs() - 求绝对值
绝对值或复数的模
abs(-10)
10
abs(1+2j)
2.23606797749979
all() - 元素都为真
接受一个迭代器,如果迭代器的所有元素都为真,那么返回True,否者返回 False。
all([1, 2, 0, 4])
False
all([1, 2, 4])
True
any() - 元素至少一个为真
接受一个迭代器,如果迭代器至少有一个元素为真,那么返回True,否者返回False。
any([0, 0, [], [1, 0], {}, ()])
True
any([0, {}, [], ()])
False
ascii() - 展示对象
调用对象的repr()方法,获得该方法的返回值,下面的例子返回值为字符串。
class Student():
def __init__(self, id, name):
self.id = id
self.name = name
def __repr__(self):
return 'id = ' + self.id + ', name = ' + self.name
dafei = Student(id='001', name='dafei')
print(dafei)
id = 001, name = dafei
ascii(dafei)
'id = 001, name = dafei'
bin() - 十进制转二进制
bin(8)
'0b1000'
oct() - 十进制转八进制
oct(8)
'0o10'
hex() - 十进制转十六进制
hex(11)
'0xb'
bool() - 布尔判断
测试一个对象是True,还是False。
bool([0,1,0])
True
bool(())
False
bool({1:0})
True
bytes() - 字符串转字节
将一个字符串转成字节类型。
s = "liubei"
bytes(s, encoding='utf-8')
b'liubei'
str() - 转为字符串
str(888)
'888'
callable() - 是否可调用
判断对象是否可被调用,能被调用的对象就是一个callable对象,比如函数str,int等都是可被调用的,但是4中的dafei实例时不可调用的:
callable(str)
True
callable(float)
True
callable(bytes)
True
callable(dafei)
False
如果想让dafei实例能被调用dafei(),需要重写Student类的call方法:
class Student():
def __init__(self, id, name):
self.id = id
self.name = name
def __repr__(self):
return 'id = '+self.id +', name = '+self.name
def __call__(self):
print('I can be called!')
print(f'my name is {self.name}')
t = Student('001', 'dafei')
t()
I can be called!
my name is dafei
chr() - 十进制转ASCII字符
查看十进制整数对应的ASCII字符
chr(88)
'X'
chr(65)
'A'
ord() - ASCII字符转十进制
ord('X')
88
ord('z')
122
classmethod - 类方法
classmethod装饰器对应的函数不需要实例化,不需要self参数,但第一个参数需要时表示自身类的cls参数,可以来调用类的属性,类的方法,实例化对象等。
class Student():
def __init__(self, id, name):
self.id = id
self.name = name
def __repr__(self):
return 'id = '+self.id +', name = '+self.name
@classmethod
def f(cls):
print(cls)
compile() - 执行字符串表示的代码
将字符串编译成python能识别或执行的代码,也可以将文字读成字符串再编译。
描述
compile() 函数将一个字符串编译为字节代码。
语法
以下是 compile() 方法的语法:
compile(source, filename, mode[, flags[, dont_inherit]])
参数
- source -- 字符串或者AST(Abstract Syntax Trees)对象。。
- filename -- 代码文件名称,如果不是从文件读取代码则传递一些可辨认的值。
- mode -- 指定编译代码的种类。可以指定为 exec, eval, single。
- flags -- 变量作用域,局部命名空间,如果被提供,可以是任何映射对象。。
- flags和dont_inherit是用来控制编译源码时的标志
s = "print('hello world!')"
r = compile(s, "<string>", "exec")
r
<code object <module> at 0x000002C585CA3450, file "<string>", line 1>
exec(r)
hello world!
complex() - 创建复数
complex(1,2)
(1+2j)
delattr() - 动态删除属性
删除对象的属性
delattr(dafei, 'id')
hasattr(dafei, 'id')
False
dict() - 转为字典
创建数据字典
dict()
{}
dict(a=1, b=2)
{'a': 1, 'b': 2}
dict(zip(['a', 'b'], [1, 2]))
{'a': 1, 'b': 2}
dict([('a', 1), ('b', 2)])
{'a': 1, 'b': 2}
dir() - 一键查看对象所有方法
不带参数时返回当前范围内的变量、方法和定义的类型列表;带参数时返回参数的属性,方法列表。
dir(dafei)
['__class__',
'__delattr__',
'__dict__',
'__dir__',
'__doc__',
'__eq__',
'__format__',
'__ge__',
'__getattribute__',
'__gt__',
'__hash__',
'__init__',
'__init_subclass__',
'__le__',
'__lt__',
'__module__',
'__ne__',
'__new__',
'__reduce__',
'__reduce_ex__',
'__repr__',
'__setattr__',
'__sizeof__',
'__str__',
'__subclasshook__',
'__weakref__',
'name']
dir()
['In',
'Out',
'Student',
'_',
'_1',
'_10',
'_11',
'_12',
'_13',
'_14',
'_15',
'_16',
'_17',
'_18',
'_19',
'_2',
'_20',
'_21',
'_25',
'_26',
'_27',
'_28',
'_3',
'_30',
'_32',
'_34',
'_35',
'_36',
'_37',
'_38',
'_39',
'_4',
'_5',
'_6',
'_9',
'__',
'___',
'__builtin__',
'__builtins__',
'__doc__',
'__loader__',
'__name__',
'__package__',
'__spec__',
'_dh',
'_i',
'_i1',
'_i10',
'_i11',
'_i12',
'_i13',
'_i14',
'_i15',
'_i16',
'_i17',
'_i18',
'_i19',
'_i2',
'_i20',
'_i21',
'_i22',
'_i23',
'_i24',
'_i25',
'_i26',
'_i27',
'_i28',
'_i29',
'_i3',
'_i30',
'_i31',
'_i32',
'_i33',
'_i34',
'_i35',
'_i36',
'_i37',
'_i38',
'_i39',
'_i4',
'_i40',
'_i5',
'_i6',
'_i7',
'_i8',
'_i9',
'_ih',
'_ii',
'_iii',
'_oh',
'dafei',
'exit',
'get_ipython',
'quit',
'r',
's',
't']
divmod() - 取商和余数
divmod(9, 2)
(4, 1)
enumerate() - 枚举对象
描述:
enumerate() 函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中。
语法:
以下是 enumerate() 方法的语法:
enumerate(sequence, [start=0])
参数:
- sequence -- 一个序列、迭代器或其他支持迭代对象。
- start -- 下标起始位置。
返回值:
返回 enumerate(枚举) 对象。
s = ['a', 'b', 'c']
for i, s in enumerate(s, 1):
print(i, s)
1 a
2 b
3 c
eval() - 计算表达式
描述:
eval() 函数用来执行一个字符串表达式,并返回表达式的值。
语法:
以下是 eval() 方法的语法:
eval(expression[, globals[, locals]])
参数:
- expression -- 表达式。
- globals -- 变量作用域,全局命名空间,如果被提供,则必须是一个字典对象。
- locals -- 变量作用域,局部命名空间,如果被提供,可以是任何映射对象。
返回值:
返回表达式计算结果。
n = 100
eval("n + 100")
200
eval("pow(2, 2)")
4
x = 2
eval("x + 2")
4
getsizeof() - 查看变量所占字节数
import sys
int = 100
bool = True
float = 1.1
str =""
list = []
tuple =()
dict = {}
set = set([])
显示大小
print("%s size is %d" %(type(int), sys.getsizeof(int)))
print("%s size is %d" %(type(bool), sys.getsizeof(bool)))
print("%s size is %d" %(type(float), sys.getsizeof(float)))
print("%s size is %d" %(type(str), sys.getsizeof(str)))
print("%s size is %d" %(type(list), sys.getsizeof(list)))
print("%s size is %d" %(type(tuple), sys.getsizeof(tuple)))
print("%s size is %d" %(type(dict), sys.getsizeof(dict)))
print("%s size is %d" %(type(set), sys.getsizeof(set)))
import sys
a = {'a':1, 'b':2.0}
sys.getsizeof(a)
232
filter() - 过滤器
描述:
filter() 函数用于过滤序列,过滤掉不符合条件的元素,返回一个迭代器对象,如果要转换为列表,可以使用 list() 来转换。
接收两个参数,第一个为函数,第二个为序列,序列的每个元素作为参数传递给函数进行判,然后返回 True 或 False,最后将返回 True 的元素放到新列表中。
语法:
以下是 filter() 方法的语法:
filter(function, iterable)
参数:
- function -- 判断函数。
- iterable -- 可迭代对象。
返回值:
返回一个迭代器对象
fil = filter(lambda x: x>10,[1,11,2,34,4,43,12])
fil
<filter at 0x2c585cba310>
list(fil)
[11, 34, 43, 12]
#求1-100之间的数的平方根是整数的数。
import math
def is_sqr(x):
return math.sqrt(x) % 1 == 0
tmplist = filter(is_sqr, range(1, 101))
newlist = list(tmplist)
newlist
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
float() - 转为浮点数
float(8)
8.0
format() - 字符串格式化
格式化输出字符重,format(value, format_spec)实质上是调用了value的format(format_spec)方法。
print("I am {0},age{1}".format("dafei",22))
I am dafei,age22
frozenset() - 创建一个不可修改的集合
描述:
frozenset() 返回一个冻结的集合,冻结后集合不能再添加或删除任何元素。
语法:
frozenset() 函数语法:
class frozenset([iterable])
参数:
iterable -- 可迭代的对象,比如列表、字典、元组等等。
返回值:
返回新的 frozenset 对象,如果不提供任何参数,默认会生成空集合。
frozenset(range(10))
frozenset({0, 1, 2, 3, 4, 5, 6, 7, 8, 9})
gy = frozenset("guanyu")
gy
frozenset({'a', 'g', 'n', 'u', 'y'})
getattr() - 动态获取对象属性
获取对象的属性值
class Student():
def __init__(self,id,name):
self.id = id
self.name = name
def __repr__(self):
return 'id = '+self.id +', name = '+self.name
dafei = Student(id='01', name='dafei')
getattr(dafei, 'id')#获取实例的属性值
'01'
hasattr() - 判断对象是否有这个属性
class Student():
def __init__(self,id,name):
self.id = id
self.name = name
def __repr__(self):
return 'id = '+self.id +', name = '+self.name
dafei = Student(id='01', name='dafei')
hasattr(dafei, 'id')
True
hasattr(dafei, 'tel')
False
hash() - 返回对象的哈希值
hash() 用于获取取一个对象(字符串或者数值等)的哈希值。
hash() 函数可以应用于数字、字符串和对象,不能直接应用于 list、set、dictionary。
在 hash() 对对象使用时,所得的结果不仅和对象的内容有关,还和对象的 id(),也就是内存地址有关。
class Test:
def __init__(self, i):
self.i = i
for i in range(10):
t = Test(i)
print(i,hash(t), id(t))
0 190464218965 3047427503440
1 190463357010 3047413712160
2 190464029835 3047424477360
3 190463369147 3047413906352
4 190463524178 3047416386848
5 190464246544 3047427944704
6 190463550440 3047416807040
7 190463681398 3047418902368
8 190463681476 3047418903616
9 190463499255 3047415988080
hash() 函数的对象字符不管有多长,返回的 hash 值都是固定长度的,也用于校验程序在传输过程中是否被第三方(木马)修改,如果程序(字符)在传输过程中被修改hash值即发生变化,如果没有被修改,则 hash 值和原始的 hash 值吻合,只要验证 hash 值是否匹配即可验证程序是否带木马(病毒)。
name1='正常程序代码'
name2='正常程序代码带病毒'
print(hash(name1)) # 2403189487915500087
print(hash(name2)) # -8751655075885266653
-2194181078385160891
8915465963883150582
hash(dafei)
190463553630
help() - 一键帮助
返回对象的帮助文档
help(dafei)
Help on Student in module __main__ object:
class Student(builtins.object)
| Student(id, name)
|
| Methods defined here:
|
| __init__(self, id, name)
| Initialize self. See help(type(self)) for accurate signature.
|
| __repr__(self)
| Return repr(self).
|
| ----------------------------------------------------------------------
| Data descriptors defined here:
|
| __dict__
| dictionary for instance variables (if defined)
|
| __weakref__
| list of weak references to the object (if defined)
id() - 返回对象的内存地址
id(dafei)
3047416858080
input() - 获取用户输入
input()
haha
'haha'
int() - 转为整数
int(x, base=10),x可以为字符串或数值,将x转换为一个普通整数。如果参数时字符串,那么它可能包含符号和小数点。如果超出了普通整数的表示范围,一个长整数被返回。
int(23.32)
23
int('12',16)
18
isinstance() - 判断对象是否是类的实例
判断object是否为类classinfo的实例,是返回True
class Student():
def __init__(self,id,name):
self.id = id
self.name = name
def __repr__(self):
return 'id = '+self.id +', name = '+self.name
dafei = Student(id='01', name='dafei')
isinstance(dafei, Student)
True
issubclass() - 父子类关系鉴定
描述:
issubclass() 方法用于判断参数 class 是否是类型参数 classinfo 的子类。
语法:
以下是 issubclass() 方法的语法:
issubclass(class, classinfo)
参数:
- class -- 类。
- classinfo -- 类。
返回值:
如果 class 是 classinfo 的子类返回 True,否则返回 False。
class undergraduate(Student):
def studyClass(self):
pass
def attendActivity(self):
pass
issubclass(undergraduate, Student)
True
class A:
pass
class B(A):
pass
issubclass(B, A)
True
issubclass(A, Student)
False
iter() - 创建迭代器
描述:
iter() 函数用来生成迭代器。
语法:
以下是 iter() 方法的语法:
iter(object[, sentinel])
参数:
- object -- 支持迭代的集合对象。
- sentinel -- 如果传递了第二个参数,则参数 object 必须是一个可调用的对象(如,函数),此时,iter 创建了一个迭代器对象,每次调用这个迭代器对象的__next__()方法时,都会调用 object。
返回值:
迭代器对象。
ls = [1, 2, 3]
for i in iter(ls):
print(i)
1
2
3
class TestIter():
def __init__(self):
self.l = [1, 2, 3, 4, 5, 6]
self.i = iter(self.l)
def __call__(self):
#定义了__call__方法的类的实例时可调用的
item = next(self.i)
print("__call__ is called, fowhich would return",item)
return item
def __iter__(self):
#指出迭代协议(即定义有__iter__()函数)
print("__iter__ is called!")
return iter(self.l)
t = TestIter()
t()#因为实现了__call__,所以t实例能被调用
__call__ is called, fowhich would return 1
1
for e in TestIter():#因为实现了__iter__方法,所以t能被迭代。
print(e)
__iter__ is called!
1
2
3
4
5
6
object() - 所有类的基类
base = object()
type(base)
object
open() - 打开文件
描述:
open() 函数用于打开一个文件,并返回文件对象,在对文件进行处理过程都需要使用到这个函数,如果该文件无法被打开,会抛出 OSError。
注意:使用 open() 函数一定要保证关闭文件对象,即调用 close() 函数。
open() 函数常用形式是接收两个参数:文件名(file)和模式(mode)。
open(file, mode='r')
完整的语法格式为:
open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
参数说明:
- file: 必需,文件路径(相对或者绝对路径)。
- mode: 可选,文件打开模式
- buffering: 设置缓冲
- encoding: 一般使用utf8
- errors: 报错级别
- newline: 区分换行符
- closefd: 传入的file参数类型
opener:
f = open('d:/a.txt', mode='r', encoding='utf-8')
f.read()
mode取值表:
| 字符 | 意义 |
|---|---|
| ‘r’ | ' 读取(默认) |
| 'w' | 写入,并先截断文件 |
| 'x' | 排它性创建,如果文件已存在则失败 |
| 'a' | 写入,如果文件存在则在末尾追加 |
| 'b' | 二进制模式 |
| 't' | 文本模式(默认) |
| '+' | 打开用于更新(读取与写入) |
pow() - 次幂
pow(base, exp, mod),base为底的exp次幂,如果mod给出,取余!
pow(3, 2, 4)
1
print() - 打印
ls = [1,2,3]
print(ls)
[1, 2, 3]
print(f'ls:{ls}')
ls:[1, 2, 3]
print('ls:{}'.format(ls))
ls:[1, 2, 3]
print('ls:', ls)
ls: [1, 2, 3]
property() - 创建属性
返回 property 属性,典型用法:
class C:
def __init__(self):
self._x = None
def getx(self):
return self._x
def setx(self, value):
self._x = value
def delx(self):
del self._x
#使用property来创建 property 属性
x = property(getx, setx, delx, "I'm the 'x' property.")
使用python装饰器,实现与上完全一样的效果代码:
class C:
def __init__(self):
self._x = None
@property
def x(self):
return self._x
@x.setter
def x(self, value):
self._x = value
@x.deleter
def x(self):
del self._x
range() - 创建序列
两种用法:
-
range(stop);
-
range(start, stop[,step])
生成一个不可变序列。
range(8)
range(0, 8)
range(2,10,2)
range(2, 10, 2)
list(range(2, 10, 2))
[2, 4, 6, 8]
reversed() - 反向迭代
rev = reversed([1, 4, 2, 3, 1])
for i in rev:
print(i)
1
3
2
4
1
round() - 四舍五入
round(x[, n]),四舍五入,n代表小数点后保留几位。
round(42342.4563242, 3)
42342.456
round(2.04, 1)
2.0
round(2.05, 1)
2.0
set() - 转为集合类型
描述:
set()函数创建一个无序不重复的元素及,可进行关系测试,删除重复数据,还可以计算交集、差集、并集等。
语法:
class set([iterable])
参数:
- iterable --可迭代对象
返回值:
新的集合对象。
a = [1, 2, 3, 4, 1, 2]
set(a)
{1, 2, 3, 4}
x = set('hello world')
y = set('python')
x,y
({' ', 'd', 'e', 'h', 'l', 'o', 'r', 'w'}, {'h', 'n', 'o', 'p', 't', 'y'})
x & y
{'h', 'o'}
x | y
{' ', 'd', 'e', 'h', 'l', 'n', 'o', 'p', 'r', 't', 'w', 'y'}
x - y
{' ', 'd', 'e', 'l', 'r', 'w'}
slice() - 转为切片对象
描述:
slice()函数主要用在切片操作函数里的参数传递。
语法:
class slice(stop)
class slice(start, stop[, step])
参数:
- start -- 其实位置
- stop -- 结束位置
- step -- 间距
返回值:
返回一个切边对象
a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
my_slice_meaning = slice(0, 11, 2)
a[my_slice_meaning]
[1, 3, 5, 7, 9, 11]
my_slice = slice(5) #设置截取5个元素的切片
my_slice
slice(None, 5, None)
b = range(10)
b[my_slice]
range(0, 5)
sorted() - 排序函数
描述:
sorted()函数对所有迭代的对象进行排序操作。
sort 与 sorted 的区别:
- sort是应用在 list 上的方法,返回的是对已经存在的列表进行操作。
- sorted 可以对所有可迭代对象进行排序操作。返回的是一个新的list,而不是在园的的基础上进行的操作。
语法:
sorted(iterable, key=None, reverse=False)
参数:
- iterable -- 可迭代对象
- key -- 主要用来进行比较的元素,只有一个参数,具体的函数的参数就是取自于可迭代对象中,指定可迭代对象中的一个元素来进行排序。
- reverse -- 排序规则,reverse=True降序,reverse=False升序(默认)。
返回值:
返回重新排序的列表,是新的列表,不是原列表。
a = [1, 5, 2, 4, 3]
sorted(a)
[1, 2, 3, 4, 5]
a
[1, 5, 2, 4, 3]
sorted({'a': 5, 'b': 3, 'c': 1, 'd': 2, 'e': 4})
['a', 'b', 'c', 'd', 'e']
a = [{'name':'dafei', 'age':19, 'gender':'male'},
{'name':'xiaohua', 'age':18, 'gender':'female'}]
sorted(a, key=lambda x: x['age'], reverse=False)
[{'name': 'xiaohua', 'age': 18, 'gender': 'female'},
{'name': 'dafei', 'age': 19, 'gender': 'male'}]
b = [5, 9, 3, 6, 2, 7]
c = sorted(b, key=lambda x: x*(-1))
c
[9, 7, 6, 5, 3, 2]
sum() - 求和函数
sum(iterable[, start]),
- iterable -- 可迭代对象,如列表、元组、集合。
- start -- 指定相加的参数,如果没有设置这个值,默认为0
sum([1, 3, 5]),sum([1, 3, 5], 10)
(9, 19)
sum((2, 1, 5), 2)
10
sum({2, 4, 6}, 10)
22
tuple() - 转元组
tuple()将对象转为一个不可变的类型类型元组。
ls = [1, 3, 5]
tp = tuple(ls)
tp
(1, 3, 5)
type() - 查看对象类型
描述:
type()函数如果只有第一个参数object则返回对象的类型,三个参数则返回新的类型的对象。
isinstance() 与 type() 区别:
- type()不会认为子类时一种父类类型,不考虑继承关系。
- isinstance()会认为子类是一种父类类型,考虑继承关系。
语法:
- type(object)
- type(name, bases, dict)
参数:
- name -- 类的名称。
- bases -- 基类的元组。
- dict -- 字典,类内定义的命名空间变量。
返回值:
一个参数返回对象类型;
三个参数返回新的类型对象。
type(1),type('dafei'), type((1, 2))
(int, str, tuple)
class X(object):
a = 1
X = type('X', (object,), dict(a=1)) #产生一个新的类型 X
X
__main__.X
class Student():
def __init__(self, id, name):
self.id = id
self.name = name
def __repr__(self):
return 'id = '+self.id +', name = '+self.name
dafei = Student(id='01', name='dafei')
type(dafei)
__main__.Student
zip() - 聚合迭代器
创建一个聚合了来自每个迭代器对象中的元素的迭代器。
x = [3, 2, 1]
y = [4, 5, 6]
list(zip(x, y))
[(3, 4), (2, 5), (1, 6)]
a = range(5)
b = list('zhangfei')
list(zip(a,b))
[(0, 'z'), (1, 'h'), (2, 'a'), (3, 'n'), (4, 'g')]
[str(y) + str(x) for x, y in zip(a, b)]
['z0', 'h1', 'a2', 'n3', 'g4']
nonlocal - 声明变量用于内嵌函数中
关键字 nonlocal 常用于函数嵌套中,声明变量i为非局部变量;如果不声明,i+=1表明i为函数wrapper内的局部变量,因为在i+=1引用(reference)时,i未被声明,所以会报unreferenced variable的错误。
def excepter(f):
i = 0
t1 = time.time()
def wrapper():
try:
f()
except Exception as e:
nonlocal i
i += 1
print(f'e.args[0]: {i}')
t2 = time.time()
if i == n:
print(f'spending time:{round(t2-t1,2)}')
return wrapper
global - 声明为全局变量
为什么要有global,一个变量被多个函数引用,想让全部变量被所有函数共享,直接用的写法:
i = 9
def pr():
print(i)
def pa():
print(i)
pass
pr()
pa()
9
9
pr()和pa()两个函数都能共享变量i,程序没有报错,所以不明白为什么要用global。但如果出现一个函数使用i递增,如下:
def h():
i += 1
h()
---------------------------------------------------------------------------
UnboundLocalError Traceback (most recent call last)
<ipython-input-64-30315b1bdaea> in <module>
2 i += 1
3
----> 4 h()
<ipython-input-64-30315b1bdaea> in h()
1 def h():
----> 2 i += 1
3
4 h()
UnboundLocalError: local variable 'i' referenced before assignment
这时出错了,抛出UnboundLocalError异常:local variable 'i' referenced before assignment(局部变量未定义),原来编译器在解释i+=1时会把i解析为函数h()内的局部变量,很显然在函数内,编译器找不到对变量i的定义,所以报错。
global就是为解决此问题而被剔除,在函数h内,显式地告诉编译器i为全局变量,然后编译器会在函数外面寻找i的定义,执行完i+=1后,i还为全部变量,值加1:
i = 3
def h():
global i
i += 1
h()
print(i)
h()
print(i)
4
5

浙公网安备 33010602011771号