查看作用域:globals()和locals() --了解下就行
a = 10
def func():
a = 20
print(locals()) # 这里打印:{'a':20},因为当前作用域的内容只有a=20
func()
print(globals()) # 查看全局作用域的所有内容
print(locals()) # 查看当前作用域中的内容 ,这里当前作用域在全局里面,所以和globals()返回一致
>>>
{'a': 20}
{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x00CABF40>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'D:/pythonPLianxi1/python/20220221.py', '__cached__': None, 'a': 10, 'func': <function func at 0x00CB7778>}
{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x00CABF40>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'D:/pythonPLianxi1/python/20220221.py', '__cached__': None, 'a': 10, 'func': <function func at 0x00CB7778>}
迭代器: iter() __iter__() next() __next__()
# 迭代器:iter
lst = [1,2,3]
# 使用迭代器有__iter__()和iter()2种
it = lst.__iter__()
it2 = iter(lst) # 其实这个iter()调用的是__iter__()
# iter()实际上是:
def iter(obj):
return obj.__iter__()
# next()和__next()用来取迭代器的下一个数据
print(it.__next__()) # 打印 :1
print(next(it)) # 打印:2;其中next()也是调用的__next__()
# next函数如下
def next(obj):
return obj.__next__()
查看内置属性 dir:查看一个内置函数能使用哪些方法,干哪些事(查看内置属性)
调用相关 callable:这个很重要叫:能调用,判断***能否被调用,是否可以在后面添加括号,有括号就是可以被调用,返回布尔值:True和False
def f1():
pass
def funce(fn):
if callable(fn): # 判断内容是否可以被调用
fn()
print('可以被调用')
else:
print('您输入的内容不可以被直接调用')
funce(f1) # 这个可以被调用输出:可以被调用
funce(123) # 这个不能被调用输出:您输入的内容不可以被直接调用
帮助相关 help:查看源码,用得少,用命令行写代码用的比较多
文件相关 open
f = open('xxx',mode='',encoding='utf-8')
f.read()
for line in f:
pass
f.write()
with open() as f: # 好处是不用关闭文件
pass
查看文件再内存的地址 id:
a=1
b=2
print(id(a)) # 输出:1673967536
print(id(b)) # 输出:1673967552
哈希 hash,其中2个一样的值哈希后的值也是一样的,注意可以哈希的数据要是不可变的
print(hash('123'),hash('sdf'),hash('sdf'))
>>>1856534906 125080430 125080430
eval:这个挺重要,可以吧字符串当代码来执行,特点是:有返回值
s= '1+1'
r = eval(s) # 把字符串当代码去执行,有返回值
print(r) # 输出:2
ss = 'a=[1,2,3]'
exec(ss) # 和eval一样,但是没有返回值,eval有返回值
print(a) # 输出:[1, 2, 3]
compile():把一段的字符串代码加载,后面可以用exec和eval执行
compile('模块1','模块2','eval/exec/single')
其中模块1和模块2是互斥的,模块1是字符串,模块2是文件地址
eval参数:模块x有返回值,用这个
exec参数:模块x没有返回值,只是执行一段代码,用这个
singl参数:有数据交互的时候使用
c1 = compile('for i in range(10):print(i)',"",'exec') # 直接拿过来用的用exec
exec (c1) # 输出:0 1 2 3 4 5 6 7 8 9
c2 = compile('1+2+3',"",'eval') # 这个计算结果的用eval
r= eval(c2) # eval有返回值,可以进行赋值
print(r) # 输出:6
c3 = compile('n = int(input("请输入数字:"))',"",'single') # 有数据交互用single
exec (c3)
print(n) # 输入什么,打印什么
重要程度:eval > exec > single
eval:把字符串当代码执行,有返回值(执行后可以赋值给变量)
exec有个安全性问题
s = input("输入代码:")
exec(s)
运行的时候输入:exit(),程序会直接退出