设为首页收藏本站

Crossin的编程教室

 找回密码
 立即加入
查看: 124436|回复: 355
打印 上一主题 下一主题

集中答疑专用贴

  [复制链接]

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

跳转到指定楼层
#
发表于 2013-9-10 20:44:07 |只看该作者 |正序浏览
提问注意事项:

1. 准确描述问题。附上必要的 代码、输出、报错,并说明版本、平台等信息,文字代码方便别人复制,截图方便别人查看。用到外部文件的时候,附上文件夹的情况截图。
2. 首先自己尝试对报错进行搜索,包括全网搜索和本站内搜索,避免重复提问。
3. 作必要的调试,输出足够的信息,缩小错误范围。请勿直接放上大段代码让别人调试,否则请移步接单区解决。

学会提问题,是解决问题的第一步。




代码问题请单独发帖提问。
简短的疑问可直接在本贴中回复

【转自2013年9月9日微信推送】

很多大学今天开始新学期了,咱们教室也增加了不少新同学。刚来的同学,可以发送p查看python入门课程的目录,也可以直接发送1~53,进入对应的课程。不用被已经进行的50多课吓到,每一课其实都很短很简单,只要你开始学,永远都不晚。

现在,我们的python的入门课程已经说得差不多了,pygame也做了简单的介绍。再往下,就要深入到某些具体领域的细节了,涉及到的代码量也会更多,逻辑更复杂。我自己觉得,这样的内容比较难在每天的推送中用较短篇幅说清楚,你们应该也不愿拿着手机看大段的代码吧。而且,在掌握了编程的基础之后,进一步的提高需要更多的讨论和练习,而不仅仅是单向的接收信息。所以我也在努力寻找一种更适合的方式把我们的课程进行下去,如果你有好的建议,欢迎给我留言。

因此,在这几天,趁着课程阶段性的完结,我打算先将课程进度稍稍缓一下,集中回答在课程的进行中,经常被问到的一些问题。同时,欢迎各位把学习至今的问题和收获反馈给我,我会尽可能回答每个问题,并且选取其中的部分,在课程中分享给所有人。

今天来说两个被问了很多次的问题:

1.写python有哪些好的IDE?

在课程一开始,我推荐了大家使用python自带的IDE--IDLE。因为你不需要再做更多的安装和配置,就可以用它来写python程序。虽然方便,但显然它不是一个很好的解决方案。

Windows平台下,可以用PyScripter,它集成了编辑器和控制台,对于语法检查、补全、断点的支持都挺好,还可以切换python版本。有点小问题就是,默认情况下,对中文的支持不好,不能把文件保存在有中文的路径下。

另一个强大的python IDE叫PyCharm。它的用户体验相当顺手。除了一般编辑器支持的代码检查、补全、折叠、调试等等功能它都做得很到位之外,它对于django、GAE等python web框架的开发也有很好的支持。可自定义、可扩展。支持Window、Mac、Linux平台。对于初学者来说唯一美中不足的是,它是一个收费软件,有30天的试用期。如果你想用它来作为你工作的帮手,还是值得入手的。

不过有很多python程序员并不用IDE,只是选择一款顺手的文本编辑器就可以了。传说中“神的编辑器”Emacs和“编辑器之神”Vim就是这类的杰出代表。近来很火的SublimeText也大有分一杯羹的势头。它们共有的特点就是强大的可扩展性。理论上来说,你可以用它完成任何一款IDE可以实现的功能,并且按你的喜好调校成你最顺手的武器。只可惜,这种工具的上手难度较高,不适合初学者。

另外,eclipse和Mac下的Xcode也可以用来写python,但由于我自己没有用过,不敢妄加评论。如果对这两个IDE有过使用经验的同学,不妨尝试下。

我本人在Linux下用Emacs23,Windows下用SublimeText2,加了一些扩展。一个好的IDE可以帮你节省很多时间,比如拼错变量名这种新手必犯的问题,就可以大大避免了。但像自动补全这种懒人功能,在初学时候慎用,多打点字是好事。

2.我把基础都看完了,接下来干什么?/
你讲的例程都能看懂,但自己写还是不会,怎么办?/
我之前也在网上学过xx语言,可是后来很快又忘了,怎么破?

这几个问题本质都差不多,大意就是:学完了,然后呢?
举两个例子:你去学一门武功,把招式秘籍背下来,能照着打了,是不是就可以行走江湖了?你去学一门乐器,DoReMi每个音阶与和弦都能演奏出来了,是不是就可以上台表演了?即使是打个太极拳强身健体,或是弹个吉他装文艺,也是得时常拿出来练练的。所以编程也是这样的事情。我个人的经验:如果学的一门语言或技术是我要去使用的,那很快就能上手;否则的话,即使我收拾好心情、做好准备去认真学,要不了多久也会忘掉。原因就在于没有后续的练习。

当年我学吉他,和弦都按得很熟练,但弹熟了几首曲子后就不知道还能怎样。直到后来找到了志同道合的朋友,组了乐队,才体会到其中的乐趣。如今你学编程,一定也有同样的困惑,我基础都学完,怎么也没有什么感觉。但幸运的是,你现在有几千个共同学习的小伙伴。不管你有方向上的还是细节上的、理论上的还是应用上的问题,总归能找到讨论和解答的人,帮你在编程道路上更进一步。

所以我对这类问题的建议:多来论坛和群里交流,不断寻找学习的点,持续练习。这也是我们一起学习比自己一个人看教程看视频的优势。希望到有天你毕业或者工作中需要编程的时候,你能说,我会python,我能搞定,我还跟人合作开发过一个网站。而不仅仅是很多年之后,有人谈到编程的时候,你淡淡一笑说,哦,我当年好像还学过一个什么语言,后来忘了。



【转自2013年9月10日微信推送】

今天是教师节,祝老师们节日快乐。然后,今早,我居然也收到了祝福。。。暗自窃喜。

把之前有几篇不属于课程系列的文章整理了一下,回复 w 可以看到文章列表。包括罚点球游戏、搭建论坛、创建微信公众号等几篇。

最近几天有同学反映,咱们的论坛不太稳定。我自己也发现了,碰上好几次帖子打不开、发帖发不上的情况,一会儿就又恢复正常了。难道是因为教室的人越来越多,服务器快撑不住了?如果是这样的话,那我倒是挺开心的。暂时如果大家遇上页面打不开就麻烦多刷新几次,刷爆了我去换新服!

继续回答提问:

1.猜大小游戏里,answer=raw_input(),然后比较answer和答案num的大小,为什么总是显示“too big”?

这个问题很多同学在刚开始都犯过。这要怪python2.7的input()和raw_input()太容易混淆。
对于input(),如果你的输入是一个数字,那么程序得到的就是这个数字值;
如果你输入了一串字符,则程序会把这串字符当作变量名去寻找它的值;
如果你想用它输入字符串,则需要在前后加上引号。
另外,input还可以接受计算表达式,得到表达式的值作为输入。

而raw_input(),不管你输入的是数字、字符还是表达式,都会直接当作一串字符作为输入。如果你在输入中加上了引号,引号也会被作为输入内容算在字符串内。

所以,如果你想输入一个整数,你应该用
answer=input()
或者
answer=int(raw_input())

或许是为了避免这种混淆,在python3中,只剩下了一个input()函数,功能相当于2.x版本中的raw_input()

2.我应该学python还是Java/C++/C/ruby/JavaScript...,要不要同时学?

首先,我的观点是不要在一开始同时学两门语言。即使你一门学了一些了,也最好不要着急学其他的。精通一门编程语言比知晓好几门更有用。不同编程语言在本质上总是有相同之处。等你从一门入手,深入掌握之后,再学其他语言就会很轻松。

至于学哪一门语言。对于大多数零基础的编程爱好者来说,我还是建议python。如我在课程中提到的,它简单、实用、易学。让你可以不用纠结一些琐碎的编程细节,就能体会到编程的思想和乐趣。

而最近也有一些计算机相关专业的同学问到我类似的问题。我觉得,既然是专业的,那就最好是按照你们学校设置的编程课程去学习。没有差的语言,只有你不会使用它。如果非要我来选择语言,我会倾向于用C++。对于专业的学生,一开始深入细节、打好基础,对以后的学习有很大的帮助。而python因为不够严谨,又太好用的,不利于在一开始养成良好的编程习惯。

3. 我的代码遇到了@#¥%……问题,为什么不显示/跳出/结果不对?

这个问题是对于一些症状难以理解、检查了很久代码也摸不到线索的问题的一个猜测。根据我个人,以及不少同学曾经的问题得到的经验来看,如果你觉得你的代码没有问题,但结果就是不对,那很大的可能性是:你有变量名拼写错了!
这也是有人诟病python的问题之一,变量未经定义就可以直接使用。如果你赋值给了一个拼写错的变量,并不会引发error提示,但却会让结果不符合你的想象。
要避免这种问题,除了编码时的细心之外,找一个能代码检查的IDE或插件会轻松许多。



【转自2013年9月11日微信推送】

如何在python中判断字符编码类型
python里面的字符编码是让人头大的一个东西,甚至很多时候你都不知道现在拿到的文本到底是什么编码。
这时候,chardet可以帮你判断编码。chardet是python的第三方扩展,用来检测字符串或文件的编码。你需要去下载它,搜索“chardet”,或者直接去:
https://pypi.python.org/pypi/chardet

下载解压之后,可以把chardet目录(不是直接解压出来的那一层)拷贝到你的代码文件夹下直接调用,也可以把chardet目录拷贝到你的python系统路径Python27\Lib\site-packages下。
使用中,你有一个待检测的字符串s,只需:
  1. import chardet
  2. print chardet.detect(s)
复制代码
就可以看到输出结果:
{'confidence': 0.98999999999999999, 'encoding': 'GB2312'}
confidence是预测这种编码的可能性,encoding是编码名称。


【转自2013年11月14日微信推送】

1. 如何查看异常处理时except里的出错信息?

给except加上第二个参数,就能得到出错信息:
try:
    # some error
    a = 1 / 0
except Exception, e:
    print e

如果需要更详细的信息,可以用这个方法:

try:
    # some error
    a = 1 / 0
except:
    import traceback
    traceback.print_exc()


2. 怎样用正则表达式匹配网页中的中文内容?

对于Python 2.x版本,需要用unicode来匹配。正则表达式的字符串前要加上u,待匹配的文本要decode()。例如:

#-*- coding:utf-8 -*-
import re
text = "你好吗?我很好!"
m = re.findall(ur"你好", text.decode("utf8"))
if m:
    print m[0].encode('utf8')
else:
    print 'not match'


3. 哪儿可以找到比较全的python文档?

英文能看得懂的话,最好可以去python官网:
http://www.python.org/doc/
这是最全最详细最权威的。(有个词叫“RTFM”,去搜搜看是什么意思)

另外有一些书,专门讲python模块的,比如《python标准库》。在论坛和群共享里可以找到网上的电子版。不过它也不是把所有内容都写上去了。


4. 代码目录里出现的pyc文件是干什么的?

pyc文件是“编译”后的python文件。python引入模块是一个比较耗时的操作,所以通过对被引入模块文件进行编译,创建它的字节编译版本pyc文件,从而提高模块引入速度。
pyc同样也是平台无关的,所以可以在不同架构的机器上运行。同时,它比较难于被逆向工程,安全性较高一些。






相关帖子

#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

0

主题

0

好友

32

积分

新手上路

Rank: 1

355#
发表于 2022-8-14 01:42:25 来自手机 |只看该作者
crossin先生 发表于 2022-8-13 23:19
你是指 list comprehension?
这个可以翻译成列表综合、列表解析式、列表推导,但不叫“推倒”,本来叫什 ...

谢谢坛主指教!手机码字难免有误,至于推倒、推导我确实不太熟悉,见谅!坛主推荐王垠,我有些惶恐,可能坛主由此及彼了,觉得我和他是一类人,但这真的是抬举我了!我称不上,只是一个脑子很笨、认死理的人。讨论本身是一件容易引起情绪的事情,我很理解,但我的初衷很清楚,不是抬杠。有些问题看似质疑,但也只是讨论的范畴,你可以同意也可以不同意,每个人都有每个人的理由,不见得都对也不见得都错。python语法很好,所以我才喜欢,但我不能总是一边倒说他好,那叫盲目崇拜。不好的地方吐槽两句,也能促进他的进步,不是吗?谁又能保证自己永远走在正确的道路上呢?所以回到上述问题,您觉得推导式好我不反驳。我只说明我的理由,打个简单的比方,a++等同于a=a+1,据说前者效率更高,也有人说是程序员太懒,总想简化代码。对我而言,我更倾向于后者,因为他一目了然。我在干什么?用语言写程序。如果追求高效,汇编不好吗?既然用了更接近自然语言的编程语言,那为什么越走越远?又想起高效这件事了?难道python发明的初衷是为了高效?用c发明一个比c更高效的?我看这才是搞笑!所以,我还是认死理的想法,既然目的是更接近自然语言,那就保持这个目的走下去。至于有些提速的办法可以交给翻译器去做,或者干脆别学python岂不是更好?!
言语冒犯,请坛主见谅!如果坛主觉得我的提问偏离了答疑贴的标准,我可以选择保持沉默。
回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

354#
发表于 2022-8-13 23:19:31 |只看该作者
子瑜略懂 发表于 2022-8-13 20:04
请教坛主:python的宗旨是简明、优雅,那为什么还要发明推倒式这种不简明也不优雅的功能呢?我知道,推倒式 ...

你是指 list comprehension?
这个可以翻译成列表综合、列表解析式、列表推导,但不叫“推倒”,本来叫什么不重要,写代码嘛,理解意思就可以。但既然你要谈论一个语法是否优雅,那至少应该先把人家的名字写对,你说是吧?不然你这个提问也太不优雅了

“不简明也不优雅”这个是你的一家之言,主观感受,我很早就在知乎上写过一个回答,找不到具体问题了,大意就是你最喜欢python里的什么语法,我的回答就是 list comprehension。知乎上流行的一句话:先问是不是,再问为什么。所以我是没法回答你这个问题的,因为我个人觉得这个语法很优雅,具有一种简洁的美感

至于你说往往造成一句话过长,那这个本身就是对list comprehension的错误用法。类似的例子,lambda函数是用来简化函数的,本就不是必须的,但如果有人把一个复杂逻辑的函数也硬要写成lambda,搞得既不好写,别人也不好读,那这不是lambda的问题,是写代码人的问题

最后要说,我是一个实用主义者,我认为python是工具,是帮助人更好解决问题的,考据细节这种事我没有兴趣,所以也不会去深究。如果你之前有看过我类似的一些文章,应该会有看到过,我有多次吐槽过一些代码还没写几行,就老是纠结A语言B语言哪个更好的人。参考你的说法,这应该算是在学编程过程中的走火入魔吧。毕竟程序员是“工程师”,工程师更多是考虑现有条件下哪一种方案更可行,而不是做评论家

另外,看了你上述的问题,我倒是推荐一个更适合你看的作者:王垠。他研究的东西或许你会喜欢
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

0

主题

0

好友

32

积分

新手上路

Rank: 1

353#
发表于 2022-8-13 20:04:38 来自手机 |只看该作者
请教坛主:python的宗旨是简明、优雅,那为什么还要发明推倒式这种不简明也不优雅的功能呢?我知道,推倒式确实可以提高效率,但是如果追求效率,直接使用c语言岂不是更快?相反,推倒式不太好理解而且往往造成一句话过长,我是不是可以理解这算是python演进过程中的走火入魔呢?
回复

使用道具 举报

0

主题

0

好友

32

积分

新手上路

Rank: 1

352#
发表于 2022-8-12 09:15:39 |只看该作者
crossin先生 发表于 2022-8-12 00:54
你非要写上else,理论上来说是没有问题,但很多时候不一定需要,比如
if 下雨就带伞,不需要 else
你一定 ...

不错,从人类自然语言角度,比如说,今天如果下雨了你记得带雨伞,就可以了,因为他隐含了,否则不用带雨伞,这句话。但是对于计算机,它是很死板的,稍一省略就可能出现歧义。因此,我建议对于编程,还是严谨一些,带上else更好。
回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

351#
发表于 2022-8-12 00:54:21 |只看该作者
子瑜略懂 发表于 2022-8-11 18:29
请教坛主:我始终认为if语句意义不大。因为判断结果总是两个方面,不是就是。所以最简单的判断语句最起码是 ...

你非要写上else,理论上来说是没有问题,但很多时候不一定需要,比如
if 下雨就带伞,不需要 else
你一定要加一个else当然也没错
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

0

主题

0

好友

32

积分

新手上路

Rank: 1

350#
发表于 2022-8-11 18:29:53 来自手机 |只看该作者
请教坛主:我始终认为if语句意义不大。因为判断结果总是两个方面,不是就是。所以最简单的判断语句最起码是if…else,用来分支处理不同的情况。而且,单独的if语句往往造成歧义错误,因为判断为否后,直接执行后续语句,这就给初学者造成一种误导,好像这是条件不成立时应该执行的。如此看来,if好像只是用在循环中的跳出了。不知道坛主是何意见?另外,我并不认同编程中的一些简练写法,他们对提高效率帮助甚微,反而增加了阅读困难,得不偿失!同理,如果用判断分支,我常常建议写完整if…else。
回复

使用道具 举报

0

主题

0

好友

32

积分

新手上路

Rank: 1

349#
发表于 2022-8-11 16:49:03 来自手机 |只看该作者
crossin先生 发表于 2022-8-11 13:57
你理解的基本正确,不过描述上不够准确

你所说的“数据类型”称之为 类型,class

如此看来,还是看英文原著好啊,中文翻译总是会出现偏差。我有空了会认真阅读python官方文档的。谢谢指教!
回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

348#
发表于 2022-8-11 13:57:29 |只看该作者
子瑜略懂 发表于 2022-8-11 13:43
请教坛主:面向对象中的对象是不是可以理解为一种特殊的数据类型?换言之,创建对象就是创建一种新的数据类 ...

你理解的基本正确,不过描述上不够准确

你所说的“数据类型”称之为 类型,class
类型实例化之后就成为 对象,object,或者叫 实例,instance

创建对象就是创建一个实例

基础的数字类型也是有一个基本的 类型class,每一个具体的数字对象都是这个类型的实例化
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

0

主题

0

好友

32

积分

新手上路

Rank: 1

347#
发表于 2022-8-11 13:43:24 来自手机 |只看该作者
请教坛主:面向对象中的对象是不是可以理解为一种特殊的数据类型?换言之,创建对象就是创建一种新的数据类型?如果是这样,那么数字型数据想必也有一个原始的对象,每一个数字又想必是它的实例化咯?
回复

使用道具 举报

0

主题

0

好友

32

积分

新手上路

Rank: 1

346#
发表于 2022-8-11 13:36:29 来自手机 |只看该作者
请教坛主:python为什么不开发一款类似vb的gui设计器?是大家觉得没有必要,还是工作量巨大,做不下来?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即加入

QQ|手机版|Archiver|Crossin的编程教室 ( 苏ICP备15063769号  

GMT+8, 2024-5-4 05:14 , Processed in 0.026259 second(s), 29 queries .

Powered by Discuz! X2.5

© 2001-2012 Comsenz Inc.

回顶部