内置的模块附带的函数:
eval('print(*tuple(x**2 if x%2 == 0 else x**3 for x in range(1, 10)))')
while True:
cmd = input('>>>').strip()
eval(cmd)
本函数是用来动态地执行一个表达式的字符串,或者compile函数编译出来的代码对象。参数expression是一个表达式字符串,或者表示编译出来代码对象的名称;参数globals是全局命名空间,可以指定执行表达式时的全局作用域的范围,比如指定某些模块可以使用。如果本参数缺省,就使用当前调用这个函数的当前全局命名空间;参数locals是局部作用域命名空间,是用来指定执行表达式时访问的局部命名空间。如果全局命名空间参数出现,但缺省内置模块,那么会自动拷贝这个模块到全局命名空间,意味着无论怎么设置,都可以使用内置模块。如果两个命名空间,都使用缺省方式,就会使用调用这个函数时的命名空间来查找相应的变量。
为什么要使用这个函数呢?这个函数的原因,应该就是动态语言与编译语言的差别之处,因为在编译语言里要动态地产生代码,基本上是不可能的,但动态语言是可以,意味着软件已经部署到服务器上了,但只要作很少的更改,只好直接修改这部分的代码,就可立即实现变化,不用整个软件重新加载。另外一个,这个功能可以用来机器学习里,比如根据用户使用这个软件频率,以及方式,可动态地修改代码,适应用户的变化。想到这里,是不是具有生命力的能力,可以自我更新代码,实现改良式进步,如果做破坏性的动作,其实就是一个病毒。
#eval()
print(eval('1 + 1'))
#全局命名空间为空,使用局部命名空间
def make_fn(code):
import math
ALLOWED_LOCALS = {v:getattr(math, v)
for v in filter(lambda x: x.startswith('_'), dir(math))
}
return eval('lambda x: %s' % code, None, ALLOWED_LOCALS)
f = make_fn('x + 1')
print(f(2))
#使用全局命名空间
def make_fng(code):
import math
ALLOWED = {v:getattr(math, v)
for v in filter(lambda x: not x.startswith('_'), dir(math))
}
ALLOWED['__builtins__'] = None
return eval('lambda x: %s' % code, ALLOWED, {})
f = make_fng('cos(x)')
print(f(9))
f = make_fng('cos(x*x)')
print(f(9))
# 进度条
import time
import sys
for i in range(0, 101, 2):
time.sleep(0.1)
char_num = i//2 # 打印多少个
per_str = '\r%s%% : %s' % (i, '*'*char_num)
print(per_str, end='', file=sys.stdout, flush=True)
def f():
def g():
return lambda x:x+1
return g
print(callable(f))
print(callable(f()))
print(callable(f()()))
print(callable(f()()(1)))
print(dir(list))
print(dir(tuple))
print(set(dir(list))-set(dir(tuple)))
print(set(dir(int))-set(dir(float)))
print(set(dir(dir))-set(dir(dir)))
print(set(dir(dir))-set(dir()))
l = [1, 2, 3, 4, 5, 6, 7, 8, 10]
print(l[slice(2, 3)])
print(l[slice(2, 3)])
print(l[2:3])
sorted()
enumerate()
函数 open() 返回 文件对象,通常的用法需要两个参数:open(filename, mode, encoding=’utf-8’)。
filename之前的r表示rawstring:原生字符串,示意后续的字符串全都无特殊意义。
>>> f = open('workfile', 'w')
>>> open(r'D:\python\aaa.py')
第一个参数是一个含有文件名的字符串。第二个参数也是一个字符串,含有描述如何使用该文件的几个字符。
通常,文件以 文本 打开,这意味着,你从文件读出和向文件写入的字符串会被特定的编码方式(默认是UTF-8)编码。模式后面的 ‘b’ 以 二进制模式 打开文件:数据会以字节对象的形式读出和写入。这种模式应该用于所有不包含文本的文件。
在文本模式下,读取时默认会将平台有关的行结束符(Unix上是 \n , Windows上是 \r\n)转换为 \n。在文本模式下写入时,默认会将出现的 \n 转换成平台有关的行结束符。这种暗地里的修改对 ASCII 文本文件没有问题,但会损坏 JPEG 或 EXE 这样的二进制文件中的数据。使用二进制模式读写此类文件时要特别小心。
>>> f.read()
'This is the entire file.\n'
>>> f.read()
''
>>> f.readline()
'This is the first line of the file.\n'
>>> f.readline()
'Second line of the file\n'
>>> f.readline()
''
>>> for line in f:
... print(line, end='')
...
This is the first line of the file.
Second line of the file
f.readlines()&list(f)
把文件中的所有行读到一个列表中
>>> f.write('This is a test\n')
15
想要写入其他非字符串内容,首先要将它转换为字符串:
>>> value = ('the answer', 42)
>>> s = str(value)
>>> f.write(s)
18
>>> f = open('workfile', 'rb+')
>>> f.write(b'0123456789abcdef')
16
>>> f.seek(5) # Go to the 6th byte in the file
5
>>> f.read(1)
b'5'
>>> f.seek(-3, 2) # Go to the 3rd byte before the end
13
>>> f.read(1)
b'd'
在文本文件中(没有以 b 模式打开),只允许从文件头开始寻找(有个例外是用 seek(0, 2) 寻找文件的最末尾处)而且合法的 偏移 值只能是 f.tell() 返回的值或者是零。其它任何 偏移 值都会产生未定义的行为。
>>> f.close()
>>> f.read()
Traceback (most recent call last):
File "<stdin>", line 1, in ?
ValueError: I/O operation on closed file
>>> with open('workfile', 'r') as f:
... read_data = f.read()
>>> f.closed
True
写一个新文件,重命名新文件替换原来的文件
import os
with open('a123', 'rb') as r_f, open('a123_swap', 'wb') as w_f:
for line in r_f:
w_f.write(line)
os.remove('a123')
os.rename('a123_swap', 'a123')