python361
① track python 361度
java">trackback在Python中非常有用,它可以显示出现异常(Exception)时代码执行栈的情况。但当我们捕捉异常,一般是自已的出错处理,因此代码执行栈的信息就看不到了,如果还想显示的话,就要用到traceback模块了。
这里只是简单的对traceback模块的介绍,不是一个完整的说明,而且只是满足我个人的要求,更详细的还是要看文档。
打印完整的traceback
让我们先看一个traceback的显示:
>>>1/0
Traceback(mostrecentcalllast):
File““,line1,in-toplevel-
1/0
ZeroDivisionError:integerdivisionormolobyzero
可以看出Python缺省显示的traceback有一个头:第一行,出错详细位置:第二、三行,异常信息:第四行。也就是说分为三部分,而在traceback可以分别对这三部分进行处理。不过我更关心完整的显示。
在traceback中提供了print_exc([limit[,file]])函数可以打印出与上面一样的效果。limit参数是限定代码执行栈的条数,file参数可以将traceback信息输出到文件对象中。缺省的话是输出到错误输出中。举例:
>>>try:
1/0
except:
traceback.print_exc()
Traceback(mostrecentcalllast):
File““,line2,in?
ZeroDivisionError:integerdivisionormolobyzero
当出现异常sys.exc_info()函数会返回与异常相关的信息。如:
>>>try:
1/0
except:
sys.exc_info()
(<classexceptions.ZeroDivisionErrorat0×00BF4CC0>,<exceptions.ZeroDivisionErrorinstanceat0×00E29DC8>,<tracebackobjectat0×00E29DF0>)
sys.exc_info()返回一个tuple,异常类,异常实例,和traceback。
print_exc()是直接输出了,如果我们想得到它的内容,如何做?使用format_exception(type,value,tb[,limit]),type,value,tb分别对应sys.exc_info()对应的三个值。如:
>>>try:
1/0
except:
type,value,tb=sys.exc_info()
printtraceback.format_exception(type,value,tb)
['Traceback(mostrecentcalllast): ','File"",line2,in? ','ZeroDivisionError:integerdivisionormolobyzero ']
这样,我们知道了format_exception返回一个字符串行表,这样我们就可以将其应用到我们的程序中了。
② python的库,方法这么多,写程序的时候能记住吗
这就是平时的工作方式。vim写python,没安装其他插件,但有自己的配置文件。
常见的项目所常用的函数很难超过50个。大量的业务函数一旦被写出来就是负责直接处理业务,而不会被其他部分调用,这些是不需要背的。
再把自己写的共享函数库整理好,往往常用函数不到10个。应用模块里引用框架级别的函数也就是二三十个的级别。加上数据中间层,设计好规范后,能背下来必要的数据表就能联想到对应的接口。
所以,一个不过2万行代码的python项目。实际需要背的函数也就是50个左右。
过百赞我就分析个实际项目。
-- 1小时的分割线 --
补充个我当前公司所开发的一个小型项目。相当于是一个网站,以及给客户端软件提供ajax api的服务器。一共10个python文件。4357行。以下逐个文件分析,但不会暴露实际代码。
1. rtb.py:75行,程序启动文件,其内的多种调用基本上就是一锤子的,即可以参考文档写完,但项目其他地方不会被使用,且作为启动文件,其本身也不会被引用。该文件的主要作用就是引用一大堆其他应用的模块,做URL分派。我因为在项目里同时使用了web.py和flask,所以多花了一点代码来做WSGI兼容两个框架的支持。
2. setting.py:56行,设置文件,也可以理解为一锤子的,而且通用性更强,每次开个新的项目,大可以把以前的配置文件抄过来,只修改必要的部分就可以用了。仅有的两处小技巧是 socket.gethostname()获得机器名后区分配置文件的环境,用以避免上线时的混乱。以及获得设置文件的当前绝对路径,供其他路径相关的操作:
CURPATH=os.path.normpath(os.path.join(os.getcwd(),os.path.dirname(__file__)))
3. shareutil.py:275行,web.py框架相关的自定义共享库,给各个应用模块提供相关支持。所以这里的函数是需要背下来的,在其他模块里比较常用的。比较常用的就是登录验证相关的:
1. BasicAuthError:自定义的异常用来强迫用户使用basic auth登录,内部系统的好方法
2. needlogin_401():装饰器函数,用于让视图先判断是否需要用户登录,如果未登录就用HTTP 401来强迫用户登录
3. settestlogin_401():设置单元测试时所用的basic auth的header
4. checklogin_header:检查header方式设置登录的,这对于javascript使用跨域header方式验证身份很必要
5. setlogin_header:设置登录header的方式,返回个字符串给客户端
6. checklogin_cookie:检查cookie方式是否登录了,返回登录信息
7. needlogin_cookie:检查视图是否登录,未登录则重定向到登录页
8. setlogin_cookie:设置cookie为登录
9. setlogout_cookie:设置cookie注销
10. logined_cookie:给单元测试提供已经登录的一个cookie
11. catcherror:装饰器,用于捕获视图的异常,并显示为出错页面
12. load_sqla:应用启动时,给上下文提供载入数据库
13. ApiResponse:我自己定义的JSON响应结构,方便构造ajax api
14. dt_to_isotime:把datetime对象转换为ISOTIME格式字符串
15. dt_to_ts:把datetime对象转换为timestamp数字
16. BootstrapForm:继承自webpy的Form的表单,提供了渲染带有Bootstrap class的支持
所以根据如上分析,一个项目中常用的也就是三种登录的一种,对应了函数的needlogin、setlogin、setlogout,三个函数。涉及常用数据库操作、ajax api的也有三个。总计6个函数需要背。
4. model.py:421行数据模型,里面有十几行一锤子的引用,标准化程度高,可以在项目之间共用。给每个字段提供类型的需要背一下相关参数,这样工作效率会高。典型的字段类型如VARCHAR、INTEGER、PRIMARYKEY、TIMESTAMP,可以算作是四个函数需要背。同时这里定义了7个表格,背下来对应用的编写有较大帮助。
5. flaskutil.py:169行。给flask框架用的共享库。给其他模块复用的概率大的多。
1. setlogin_cookie:设置cookie方式已登录
2. setlogout_cookie:设置cookie方式注销
3. needlogin_cookie_header:用OR方式检查cookie或header是否包含有效登录信息
4. setlogin_header:设置登录过的头,用以单元测试
5. make_before_request:给每个会话设置数据库会话
6. teardown_request:在会话结束时清理数据库资源
7. api_response:提供JSON格式的ajax api响应所需的函数
所以如上可以看到所有这些函数与shareutil有很大重复。这里不再计入需要背的数量。
6. app_api.py:1405行。ajax api的实际实现,使用了webpy框架。这里引用的部分不再重复,反正也是要被放弃的。写了26个API,他们都是直接被暴露出去,不会被其他模块调用,所以没必要背。
7. app_compiler:一个编译器代理,太窄的方向没必要分析。
8. app_home.py:361行。主页和登录逻辑。主要提取一下Flask框架里常用而值得背的几个函数:
1. render_template:渲染模板的,很简单
2. redirect:重定向
3. abort:生成错误页面
4. Response:生成格式可定制的响应
5. g:会话相关的全局变量
所以对于常用Flask框架的,这5个函数就需要特别熟悉。
9. app_mgnt.py:871行。管理后台,也是常见的业务模块,所以互相之间无依赖,使用到的flask功能也同上,不过这里开始使用Flask的Form,所以需要记住一些常用的字段类型:TextField、PasswordField、IntegerField、BooleanField、SelectField、TextAreaField,有6个。
10. app_teacher.py:366行。一个业务管理模块,没啥新意。
所以根据如上项目的分析可见,需要背下来的函数主要是在项目里需要使用多于1次的。包括框架的功能和自己写的共享库等。累计下来一共30个函数或对象。背30个函数可真是没难度的。
-- 补充 --
web.py的作者去世多年,之后有些人尝试维护,但维护水平实在不敢恭维。至今在表单缺字段的处理,单元测试中set-cookie支持等存在缺陷。所以尽管我很喜欢这个框架的思路,但以后不会再用了。
③ 关于python调用pyrouge时的问题求帮忙,我在调用时出现了这个问题怎么办
从提示看,match.groups(0) 可能返回一个空tuple, 所以取不到首位。
会不会是 match.group(0)
国际惯例,自己再改改,然后去git commit.
④ 如何在anaconda运行python2和python3 mac
打开terminal,输入
conda create --name python36 python=3.61
目的是创建一个新的Python 3.6的环境。然后,终端会请求安装新的包到目录/Applications/anaconda/envs/python36下,按y同意请求(Anaconda之前选择装在了应用程序下,其实Python 3的包就单独装在.../envs/下)。
激活Python 3.6
激活新建的Python 3.6环境,输入
source activate python361
激活后,会发现terminal输入的地方多了python36的字样, 再输入
python --version1
可以看到系统已经成功切换到了Python 3.6的环境。
⑤ python第三方库安装到哪里
1、首先通过pip安装的第三方库,一般都在python安装路径下的Libsite-packages目录,这里可以通过pip安装一个第三方库看一下,如下图所示。
⑥ 用python将本地文件上传到FTP报错
应该是没有权限创建文档
⑦ python int()数字转换问题
这个问题的原因是你用的np.zeros(count),它的默认数据类型是float类型的,而且不管你往这个np列表传入什么类型的值,它都是自动改为float类型。注意这个float类型可不是原生的浮点类型, 虽然“看”起来差不多, 但如果用type函数的话就能看出来区别了。
有两种解决方法可以解决你的问题。
list = np.zeros(count) 改为 list = np.zeros(count,dtype=int)。 这样就不会出现你所说的问题, 但对于你的这段程序用numpy有点大材小用了。 建议你用下面的方法。
list = np.zeros(count) 改为 list = [0 for i in range(count)]
然后第二张图的错误提示正是因为numpy试图把字符串自动转换为浮点数,但显然是不可能的。为了避免这个错误就必要用我上面的第二个解决方法才行了。
最后,你的代码有可优化的空间,太多遍历和判断条件了。可能会很长,但可能会对你有一些启发,如果没有耐心的话,可以看最后一条就是最终完成的代码。
slice函数处理逻辑过于复杂了。 你是想把如361变成[3,6,1]这样的情况吧。那为何不使用list(str(361))呢,虽然最后的结果里面的元素是字符串类型,但后面直接用int(i)的方式解决了。这样的话,count函数都可以省略了。
看到slice函数下面的for遍历语句,我明白了你的用意,就是为了计算各个位数相加的和,这样的话,就连slice函数都没必要了。直接下面代码就可以了:
foriinstr(n):
sum+=int(i)
3.再继续,发现又是slice和for循环,原来是要继续把sum分开。直接list(str(sum))即可。
4.到最后了,我看到了很多条件判断,总觉得条件判断这么写,显得有点罗嗦了点。可以把你这个条件判断写一个类似配置文件的对象,其实就是字典对象。 最终给你总结一下你的代码就是下面这样的:
#input直接用字符串类型就够用了。然后去掉所有import
inputStr=input()
sum=0
#这条赋值语句其实无所谓,但对于理解代码来说还是很重要的,反正也不影响性能,何乐而不为呢。
result=[]
#下面的是类似配置文件的字典对象
convertDic={'1':'yi','2':'er','3':'san','4':'si','5':'wu','6':'liu','7':'qi','8':'ba','9':'jiu','0':'ling'}
#算出input的各个位相加的和
foriininputStr:
sum+=int(i)
#str也是可迭代的类型,所以通过map和lambda匿名函数把各个值变成相对应的拼音。
result=list(map(lambdax:convertDic[x],str(sum)))
print(result)
#去掉注释和print语句,这段程序只用了7行,而且理解起来是不是还挺简单的(除了最后一条)
#我相信你对于上面的语句不是很懂,里面涉及了两个看起来“高达上的东西”,但其实就是一种简写形式。
#map就是映射,简单说就是一个循环,就是把每一个元素经过一个函数处理后再返回来的过程。
#lambda是一个匿名函数,没有函数名,只能有一个表达式,且这个表达式就是返回值。它就是一个精简版的函数而已。当然,map里面也可以直接写已定义好的函数名。
#最后我用比较通俗的代码给你解释一下上面那句语句的大致的工作流程。
#定义一个函数,相当于上面的匿名函数.
defconvert(x):
returnconvertDic[x]
#然后遍历sum,并把每个元素替换成相应的拼音。现在的sum是一个int类型,int类型是不能迭代的或者遍历的,所以需要把int转换成str类型。
#这里讲一点map和这个循环遍历的区别,首先map会把已有的元素替换成经过函数处理的值。但这条循环是在一个空的list对象里添加数据,这是区别。当然,也可以写替换数据的循环,但代码量不是这2行了,会更多。如果要遍历的话,这种写法还是比较推荐的。
foriinstr(sum):
result.append(convert(i))
#result.append(convertDic[x])也可以这样写,但为了解释上面那条语句,所以这条注释掉当给你的启发。
#最后print就可以看到结果了,也就是说,我们把4条一句压缩成了一天语句了。如果还是不了解的话,可以翻翻文档什么的,里面会有一些例子可当参考。
print(result)
⑧ python 安装 tabula-py
建议你解压这个压缩文件,然后查看readme文件,内有安装方法。你的这种安装方法错误太多,原因缺少支持和兼容问题,可以如下几种安装方法:
1)pip install tabula-py;
国内镜像:pip install -i https://mirrors.aliyun.com/pypi/simple/ tabula-py
2)下载whl文件安装,版本要和你的python和系统一致。
⑨ Python语言设计天天向上3.2—3.3
ability = 1
b = 1
days = 365
while b <= days:
if b <= 3:
ability = 1
elif b > 3:
ability += ability * 0.01 #4
b = b + 1
print(ability)
days = 365
b = 1
e = 1
c = int((days - 10) / 10) * 6 #从11到360天,每十天只在上十天的结果基础上只增长6天,从11到360天实际增长了c天
while b <= 10:
#前十天能力增长为ability
if b <= 3:
ability = 1
elif b > 3:
ability += ability * 0.01
b = b + 1
while e <= c:
#从11到360天能力增长结果为ability
ability = ability + ability * 0.01
e = e + 1
#从361到365天能力增长结果为ability
ability += ability * 0.1
print(ability)
⑩ python label.config这个配置用法问题
找不到资料,通常是看源代码的。 好在python的源代码有时候比帮助,或者是在网上找的东西更好用。 另外有一个国外写的书。 tkinter编程,有机会可以下载一本看看,基本上你要的问题都有答案。
下面简单说一下看源代码的事情。
在python2.7的lib/lib-tk目录下有一个ttk.py文件,打开可以看到classLable(Widget)
发现,它初始时调用了一个通用的Widget类,(强大)
classWidget(Tkinter.Widget):
调用了
Tkinter.Widget.__init__
Tkinter里
classWidget(BaseWidget,Pack,Place,Grid):
其中BaseWidget的setup显示,你可以输入任何参数,
参数需要是classtype,和DictionaryType,它是动态添加的。所以不保证其一定生效
但是如果它不在conf里,就删除
这些参数应该用于,widget本身属性,以及Pack,Place,Grid等类使用
classMisc:
这里面有所有的参数。太长了。如果你有耐心,可以仔细去看看。
如果有兴趣,可以继续追一下tcl/tcl8.5里的代码。其中似乎也有所有的configure
顺便帮你查找了《python与tkiner编程》这本书。在361和362页有所有你要的基本参数。太多了,这里就不列表了。
375页有label特有的选项。包括bgstipple, fgstipple, lmargin1, lmargin2, offset, overstrike, margin, tabs, underline等
标准选项有:backgroud, borderwidth, font, foregroud, justify, relief
你在问题里列的width, height等 应该是属于Pack, Place, Grid用的。
395页有大部分控件共享选项的详细说明。
53页有label的简单使用说明
有这本书,基本上就不用自己看源代码了。作者是1993年就开始使用python的老手。
另外你还可以使用HELP这个方法 。
>>>fromTkinterimport*
>>>root=Tk()
>>>label=Label(root,text='xiaodeng')
>>>help(label.config)
:
configure(self,cnf=None,**kw)methodofTkinter.Labelinstance
Configureresourcesofawidget.
arguments.Togetanoverviewabout
.
根据help的提 示, 你需要检查 它的keys
>>>printlabel.keys()
['activebackground','activeforeground','anchor','background','bd','bg','bi
tmap','borderwidth','compound','cursor','disabledforeground','fg','font',
'foreground','height','highlightbackground','highlightcolor','highlightthick
ness','image','justify','padx','pady','relief','state','takefocus','text
','textvariable','underline','width','wraplength']
OK, 上面应该就是你要的答案了。 以后都可以用这个方法来找参数了。