inscopepython
㈠ python中的for in的相关问题
A.因为已经引入了来sqrt函数,如果在自源己的空间中执行 sqrt=1 '把sqrt当成了一个变量,再运行sqrt(4)会出错
例子中 exec运行代码 在Scope空间中 sqrt是个变量,赋值1,如果没有in scope,那么exce运行空间就是本空间,再次sqrt(4)就会出错。
对比:
a=1234
exec 'a=4321'
a
4321
和代码:
a=1234
b={}
exec 'a=4321' in b
a
1234
B:print [x*x for x in range(10) if x % 3 == 0]
这里range(10)产生0,1,2~8,9 这10个数字
后面添加了条件x % 3 ==0,就是判断 x除以3的余数 等于0, 筛选出0、3、6、9
传递给x*x,就产生了一个列表:[0,9,36,81]
㈡ 求问Python大神,为什么已经设置了全局变量,还现实未定义变量
#你没有理解global的意义
markov_dicts={}
defparse():
globalmarkov_dicts#以后出现的就是修改global的内容
markov_dicts["a"]=1
print(markov_dicts)#直接调用
defprint_globvar():
print(markov_dicts)#直接调用
parse()
print_globvar()
你原专始代码里面print的时候那属个markov_dicts 还没有定义。
>>>defa():
...globalm
...m=1
...
>>>a()
>>>m
1
>>>printm
1
>>>defb():
...globaln
...n=2
...
>>>printn
Traceback(mostrecentcalllast):
File"<stdin>",line1,in<mole>
NameError:name'n'isnotdefined
>>>b()
>>>n
2
㈢ Python字符串格式化的问题
import fileinput, re
field_pat = re.compile(r'\[(.+?)\]')
scope = {}
def replacement(match):
code = match.group(1)
try:
return str(eval(code, scope))
except Exception as ex:
exec(code, scope)
return ''
lines = []
for line in fileinput.input('Email.py'):
lines.append(line)
print lines
text = ''.join(lines)
print(field_pat.sub(replacement, text))
eval(expression, global=None, local=None)
参数是字符串和可选的global和local。global应当为一个字典文件,local应为一个映射对象。
expression参数将被处理为一个python的表达式(严格来说,是一串条件语句),global和local参数将被用来当做全局和局部的命名空间。
exec(object[,global,[locals])
这个函数能够为python提供动态的代码执行功能。
㈣ python编程问题
错误:
复制代码代码如下:
>>> def f(x, y):
print x, y
>>> t = ('a', 'b')
>>> f(t)
Traceback (most recent call last):
File "<pyshell#65>", line 1, in <mole>
f(t)
TypeError: f() takes exactly 2 arguments (1 given)
【错误分析】不要误以为元祖里有两个参数,将元祖传进去就可以了,实际上元祖作为一个整体只是一个参数,
实际需要两个参数,所以报错。必需再传一个参数方可.
复制代码代码如下:
>>> f(t, 'var2')
('a', 'b') var2
更常用的用法: 在前面加*,代表引用元祖
复制代码代码如下:
>>> f(*t)
'a', 'b'
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
错误:
复制代码代码如下:
>>> def func(y=2, x):
return x + y
SyntaxError: non-default argument follows default argument
【错误分析】在C++,Python中默认参数从左往右防止,而不是相反。这可能跟参数进栈顺序有关。
复制代码代码如下:
>>> def func(x, y=2):
return x + y
>>> func(1)
3
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
错误:
复制代码代码如下:
>>> D1 = {'x':1, 'y':2}
>>> D1['x']
1
>>> D1['z']
Traceback (most recent call last):
File "<pyshell#185>", line 1, in <mole>
D1['z']
KeyError: 'z'
【错误分析】这是Python中字典键错误的提示,如果想让程序继续运行,可以用字典中的get方法,如果键存在,则获取该键对应的值,不存在的,返回None,也可打印提示信息.
复制代码代码如下:
>>> D1.get('z', 'Key Not Exist!')
'Key Not Exist!'
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
错误:
复制代码代码如下:
>>> from math import sqrt
>>> exec "sqrt = 1"
>>> sqrt(4)
Traceback (most recent call last):
File "<pyshell#22>", line 1, in <mole>
sqrt(4)
TypeError: 'int' object is not callable
【错误分析】exec语句最有用的地方在于动态地创建代码字符串,但里面存在的潜在的风险,它会执行其他地方的字符串,在CGI中更是如此!比如例子中的sqrt = 1,从而改变了当前的命名空间,从math模块中导入的sqrt不再和函数名绑定而是成为了一个整数。要避免这种情况,可以通过增加in <scope>,其中<scope>就是起到放置代码字符串命名空间的字典。
复制代码代码如下:
>>> from math import sqrt
>>> scope = {}
>>> exec "sqrt = 1" in scope
>>> sqrt(4)
2.0
㈤ python函数
参数match是正则表达式匹配后的结果,match.group(1)就是返回结果1。
import re
m = re.search('(^.+?)\n(.+?$)', 'print "111"\nprint "222"')
print m.group(1)#print "111"eval()一般是用来执行字符串代码,也就是命令注入。
其中的参数code:就是要执行的代码,比如print
"111"
其中的参数scope:是code执行范围的字典.
由于匹配的字符串代码经常有格式对齐等问题,所以加一个try
except来捕捉。
exec跟eval类似,可以执行代码,但是只是一个语法,没有返回值。
exec
code
in
scope就是执行code作用范围为scope字典
㈥ python基础教程 10-11例子如何执行
10. 模块相关
Python的标准安装包包括一组模块,称为标准库(standard library)。
10.1 模块
10.1.1 模块是程序
# hello.pyprint "Hello, world!"# 保存放在C:python# 告诉解释器在哪里寻找模块>>> import sys>>> sys.path.append('c:/python')# 这样,解释器除了从默认的目录中寻找之外,还需要从目录c:python中寻找模块>>> import hello
Hello, world!123456789101112
导入模块多次和导入一次的效果是一样的。如果坚持重新载入模块,可以使用内建的reload函数。
10.1.2 模块用于定义
在模块中定义函数
# hello2.pydef hello():
print "Hello, world# 使用import hello2
hello2.hello()1234567
在模块中增加测试代码
为 “告知” 模块本身是作为程序运行还是导入到其他程序,需要使用__name__变量:
# hello4.pydef hello():
print "Hello, world!"def test():
hello()if __name__ == '__main__': test()123456789
10.1.3 让模块可用
将模块放置在正确位置
# 下面命令列出的路径都可以放置,但site-packages目录是最佳选择>>> import sys, pprint>>> pprint.pprint(sys.path)123
告诉编译器去哪里找
除了编辑sys.path外,更通用的方法是设置环境变量PYTHONPATH
10.1.4 包
当模块存储在文件中时(扩展名.py),包就是模块所在的目录。为了让Python将其作为包对待,它必须包含一个命名为__init__py的文件(模块)。如果将它作为普通模块导入的话,文件的内容就是包的内容。
vim constants/__init__.py
PI=3.14# 别的地方引用import constantsprint constants.PI1234567
10.2 探究模块
10.2.1 模块中有什么
使用dir
查看模块包含的内容,它会将对象(以及模块的所有函数、类、变量等)的所有特性列出。
# 导入模块
import # 列表推导式是个包含dir()中所有不以下划线开头的名字的列表。
[n for n in dir()] if not n.startwith('_')]12345
__all__变量
这个变量包含一个列表,该列表与上一节的列表类似。
.__all__1
它定义了模块的共有接口,在编写模块的时候,像设置__all__这样的技术是相当有用的。
__all__ = ["Error", "", "deep"]1
10.2.2 用help获取帮助
使用help函数,获得帮助文本。
help(.)1
10.2.3 文档
参考
10.2.4 使用源代码
方案一:检查sys.path,然后自己找。
方案二:检查模块的__file__属性
10.3 标准库
10.3.1 sys
sys这个模块能够访问与Python解释器联系紧密的变量和函数。部分重要函数和变量如下:
函数/变量
描述
argv 命令行参数,包括传递到Python解释器的参数,脚本名称
exit([arg]) 退出当前的程序,可选参数为给定的返回值或错误信息
moles 映射模块名字到载入模块的字典
path 查找模块所在目录的目录名列表
platform 类似sunos5或win32的平台标识符
stdin 标准输入流——一个类文件(file-like)对象
stdout 标准输出流
stderr 标准错误流
10.3.2 os
os模块提供了访问多个操作系统服务的功能。下表列出一些最有用的函数和变量。另外,os和它的子模块os.path还包含一些用于检查、构造、删除目录和文件的函数,以及一些处理路径的函数(例如,os.path.split和os.path.join让你在大部分情况下都可以忽略os.pathsep)。
函数/变量
描述
environ 对环境变量进行映射
system(command) 在子shell中执行操作系统命令
sep 路径中的分隔符
pathsep 分隔路径的分隔符
linesep 行分隔符
urandom(n) 返回n个字节的加密强随机数据
10.3.3 fileinput
fileinput模块能够轻松地遍历文本文件的所有行。
函数/变量
描述
input([files[, inplace[, backup]]]) 便于遍历多个输入流中的行
filename() 返回当前文件的名称
lineno() 返回当前(累计)的行数
filelineno() 返回当前文件的行数
isfirstline() 检查当前行是否是文件的第一行
isstdin() 检查最后一行是否来自sys.stdin
nextfile() 关闭当前文件,移动到下一个文件
close() 关闭序列
为Python脚本添加行号
# numberlines.pyimport fileinputfor line in fileinput.input(inplcae=True) line = line.rstrip() num = fileinput.lineno()
print '%-40s # %2i' % (line, num)12345678
10.3.4 集合、堆和双端队列
集合
Set类位于sets模块中。非重复、无序的序列。
堆
堆(heap)是优先队列的一种。使用优先队列能够以任意顺序增加对象,并且能在任何时间找到最小的元素,也就是说它比用于列表的min方法要有效率得多。下面是heapq模块中重要的函数:
函数
描述
heappush(heap, x) 将x入堆
heappop(heap) 将堆中最小的元素弹出
heapify(heap) 将heap属性强制应用到任意一个列表,将其转换为合法的堆
heapreplace(heap, x) 将堆中最小的元素弹出,同时将x入堆
nlargest(n, iter) 返回iter中第n大的元素
nsmallest(n, iter) 返回iter中第n小的元素
元素虽然不是严格排序的,但是也有规则:i位置处的元素总比2*i以及2*i+1位置处的元素小。这是底层堆算法的基础,而这个特性称为堆属性(heap property)。
双端队列(以及其他集合类型)
双端队列(Double-ended queue)在需要按照元素增加的顺序来移除元素时非常有用。它能够有效地在开头增加和弹出元素,这是在列表中无法实现的,除此之外,使用双端队列的好处还有:能够有效地旋转(rotate)元素。deque类型包含在collections模块。
10.3.5 time
time模块所包含的函数能够实现以下功能:获得当前时间、操作时间和日期、从字符串读取时间以及格式化时间为字符串。日期可以用实数或者包含有9个整数的元组。元组意义如下:
索引
字段
值
0 年 比如2000等
1 月 范围1~12
2 日 范围1~31
3 时 范围0~23
4 分 范围0~59
5 秒 范围0~61(应付闰秒和双闰秒)
6 周 当周一为0时,范围0~6
7 儒历日 范围1~366
8 夏令日 0、1、-1
time的重要函数:
函数
描述
asctime([tuple]) 将时间元组转换为字符串
localtime([secs]) 将秒数转换为日期元组,以本地时间为准
mktime(tuple) 将时间元组转换为本地时间
sleep(secs) 休眠secs秒
strptime(string[, format]) 将字符串解析为时间元组
time() 当前时间(新纪元开始后的秒数,以UTC为准)
10.3.6 random
random模块包括返回随机数的函数,可以用于模拟或者用于任何产出随机输出的程序。
如果需要真的随机数,应该使用os模块的urandom函数。random模块内的SystemRandom类也是基于同样功能。
函数
描述
random() 返回0 <= n < 1之间的随机实数n,其中0 < n <=1
getrandbits(n) 以长整型形式返回n个随机位
uniform(a, b) 返回随机实数n,其中a <= n < b
randrange([start], stop, [step]) 返回range(start, stop, step)中的随机数
choice(seq) 从序列seq中返回随机元素
shuffle(seq[, random]) 原地指定序列seq
sample(seq, n) 从序列seq中选择n个随机且独立的元素
示例一:
from random import *from time import *
date1 = (2008, 1, 1, 0, 0, 0, -1, -1, -1)
time1 = mktime(date1)
date2 = (2009, 1, 1, 0, 0, 0, -1, -1, -1)
time2 = mktime(date2)
random_time = uniform(time1, time2)print asctime(localtime(random_time))12345678910
10.3.7 shelve
提供一个存储方案。shelve的open函数返回一个Shelf对象,可以用它来存储内容。只需要把它当做普通的字典来操作即可,在完成工作之后,调用close方法。
import shelve
s = shelve.open('test.dat')
s['x'] = ['a', 'b', 'c']# 下面代码,d的添加会失败# s['x'].append('d')# s['x']# 正确应该使用如下方法:temp = s['x']
temp.append('d')
s['x'] = temp123456789101112
10.3.8 re
re模块包含对正则表达式的支持。
正则表达式
.号只能匹配一个字符(除换行符外的任何单个字符)。
为转义字符
字符集:使用[]括起来,例如[a-zA-Z0-9],使用^反转字符集
选择符(|)和子模式():例如'p(ython|erl)'
可选项(在子模式后面加上问号)和重复子模式:例如r'(http://)?(www.)?python.org,问号表示出现一次或根本不出现。
(pattern)*:允许模式重复0次或多次
(pattern)+:允许模式重复1次或多次
(pattern){m,n}:允许模式重复m~n次
字符串的开始(^)和结尾($)
所有的重复运算符都可以通过在其后面加上一个问号变成非贪婪版本,例如:r'**(.+?)**'
- emphasis_pattern = r'*([^*]+)*'# 或者用VERBOSE标志加注释,它允许在模式中添加空白。emphasis_pattern = re.compile(r'''
- * # 开始的强调标签
- ( # 组开始
- [^*]+ # 除了星号的所有字符
- ) # 组结束
- * # 结束的强调标签
- ''', re.VERBOSE)
- re.sub(emphasis_pattern, r'<em>1</em>', 'Hello, *world*!')# 结果'Hello, <em>world</em>!'12345678910111213141516
- # 示例一# 匹配内容:From: Foo Fie <[email protected]># find_sender.pyimport fileinput, re
- pat = re.compile('From: (.*) <.*?>$')for line in fileinput.input():
- m = pat.match(line) if m: print m.group(1)# 执行$ python find_sender.py message.eml# 示例二# 列出所有Email地址import fileinput, re
- pat = re.compile(r'[a-z-.]+@[a-z-.]+', re.IGNORECASE)
- addresses = set()for line in fileinput.input(): for address in pat.findall(line):
- addresses.add(address)for address in sorted(addresses): print
- 'The sum of 7 and 9 is [7 + 9].'
- 应该翻译成'The sum of 7 and 9 is 16.'
- 同时,可以在字段内进行赋值
- '[name="Mr. Gumby"]Hello, [name]'
- 应该翻译成'Hello, Mr. Gumby'12345678
- # templates.py#!/usr/bin/python# -*- coding: utf-8 -*-import fileinput, re# 匹配中括号里的字段field_pat = re.compile(r'[(.+?)]')# 我们将变量收集到这里scope = {}# 用于re.sub中def replacement(match):
- code = match.group(1) try: # 如果字段可以求值,返回它:
- return str(eval(code, scope)) except SyntaxError: # 否则执行相同作用域内的赋值语句......
- exec code in scope # ......返回空字符串
- return ''# 将所有文本以一个字符串的形式获取lines = []for line in fileinput.input():
- lines.append(line)
- text = ''.join(lines)# 将field模式的所有匹配项都替换掉print field_pat.sub(replacement, text)
functools:能够通过部分参数来使用某个函数(部分求值),稍后再为剩下的参数提供数值。
difflib:可以计算两个序列的相似程度。还能从一些序列中(可供选择的序列列表)找出和提供的原始序列“最像”的那个。可以用于创建简单的搜索程序。
hashlib:可以通过字符串计算小“签名”。
csv:处理CSV文件
timeit、profile和trace:timeit(以及它的命令行脚本)是衡量代码片段运行时间的工具。它有很多神秘的功能,应该用它代替time模块进行性能测试。profile模块(和伴随模块pstats)可用于代码片段效率的全面分析。trace模块(和程序)可以提供总的分析(覆盖率),在写测试代码时很有用。
datetime:支持特殊的日期和时间对象,比time的接口更直观。
itertools:有很多工具用来创建和联合迭代器(或者其他可迭代对象),还包括实现以下功能的函数:将可迭代的对象链接起来、创建返回无限连续整数的迭代器(和range类似,但没有上限),从而通过重复访问可迭代对象进行循环等等。
logging:输出日志文件。
getopt和optparse:在UNIX中,命令行程序经常使用不同的选项或开关运行。getopt为解决这个问题的。optparse则更新、更强大。
cmd:可以编写命令行解释器。可以自定义命令。
- open(name[, mode[, buffering]])1
- >>> f = open('somefile.txt', 'w')>>> f.write('Hello, ')>>> f.write('World!')>>> f.close()>>> f = open('somefile.txt', 'r')>>> f.read(4) # 读取的字符数(字节)'Hell'>>> f.read()'o, World!'12345678910
- # somescript.pyimport systext = sys.stdin.read()words = text.split()
- wordcount = len(words)
re模块的内容
re模块中一些重要的函数
函数
描述
compile(pattern[, flags]) 根据包含正则表达式的字符串创建模式对象
search(pattern, string[, flags]) 在字符串中寻找模式
match(pattern, string[, flags]) 在字符串的开始处匹配模式
split(pattern, string[, maxsplit=0]) 根据模式的匹配项来分隔字符串
findall(pattern, string) 列出字符串中模式的所有匹配项
sub(pat, repl, string[, count=0]) 将字符串中所有pat的匹配项用repl替换
escape(string) 将字符串中所有特殊正则表达式字符转义
匹配对象和组
对于re模块中那些能够对字符串进行模式匹配的函数而言,当能找到匹配项时,返回MatchObject对象。包含了哪个模式匹配了子字符串的哪部分的信息。——这些“部分”叫做组。
组就是放置在圆括号内的子模式。组的序号取决于它左侧的括号数。组0就是整个模式。
re匹配对象的一些方法:
方法
描述
group([group1, …]) 获取给定子模式(组)的匹配项
start([group]) 返回给定组的匹配项的开始位置
end([group]) 返回给定组的匹配项的结束位置(和分片一样,不包括组的结束位置)
span([group]) 返回一个组的开始和结束位置
作为替换的组号和函数
示例:假设要把'*something*'用<em>something</em>替换掉:
找出Email的发信人
模板系统示例
模板是一种通过放入具体值从而得到某种已完成文本的文件。
示例:把所有'[somethings]'(字段)的匹配项替换为通用Python表达式计算出来的something结果
代码如下
10.3.9 其他标准模块
10.4 新函数
函数
描述
dir(obj) 返回按字母顺序排序的属性名称列表
help([obj])
reload(mole)
11. 文件
11.1 打开文件
open函数用来打开文件,语法如下:
11.1.1 文件模式
默认只读打开。
值
描述
‘r’ 读模式
‘w’ 写模式
‘a’ 追加模式
‘b’ 二进制模式(可添加到其他模式中使用)
‘+’ 读/写模式(可添加到其他模式中使用)
11.1.2 缓存
open函数的第三个参数(可选)控制文件的缓冲。有缓冲时,只有使用flush或close时才会更新硬盘上的数据。
值
描述
0或False 无缓冲
1或True 有缓冲
大于1的数字 缓冲区大小(字节)
-1或负数 默认的缓冲区大小
11.2 基本文件方法
11.2.1 读和写
11.2.2 管式输出
㈦ python中如何在函数中把字符串中的global语句执行
[root@-xlPythonTest]#vimstu.py
#!/usr/bin/python
#coding=utf-8
scope={}
defaddstu():
code=raw_input('请输入学生的学号')
exec('d'+code+'='+code)inscope
printscope['d'+code]
addstu()
[root@-xlPythonTest]#pythonstu.py
请输入学生的学号123
123
法二内:传参数也容行
#!/usr/bin/python
#coding=utf-8
defaddstu(scope):
code=raw_input('请输入学生的学号:')
scope['d'+code]=code
printscope['d'+code]
scope={}
addstu(scope)
printscope
[root@-xlPythonTest]#pythonstu.py
请输入学生的学号:456
456
{'d456':'456'}