有没有懂python的,本人现在在自学python找工作,照着教程打的字段,但是这块提示出错,怎么改呢,

后使用快捷导航没有帐号?
查看: 999|回复: 24
给零基础学“python突击”同学的一点建议
注册会员, 积分 158, 距离下一级还需 42 积分
论坛徽章:21
本帖最后由 xiaotuugo 于
23:05 编辑
第五周的作业涉及到数据库操作和文件操作两个方面,对于零基础的同学就需要自己额外去自学很多东西,相比前四周确实是比较困难。我也是第一次接触python和my,但是因为之前学习过一些perl和oracle,所以作业还是能写个大概,这里有一些自己解题的思路分享给大家:
首先,mysql环境搭建,需要安装mysql和navicate两个软件,网上都有教程,照着装就行,可能会遇到环境变量没配好或者root用户密码不会修改等问题,但不算难点,花一些时间都能够自行解决。python的驱动包就不说了,照着老师视频装就行。
环境搭建好之后,先分析一下书面作业的内容:
1)请把这个地址库用 SQL方式插入到Mysql数据库表中(表结构自行定义)2)自定义两个ip地址,判断该地址所属国家和运营商。
可以分解成如下步骤:1)用python读取文件2)把读取的每一行文件格式化成对应的4个字段3)连接数据库4)把数据插入数据库5)判读某个IP属于哪个运营商
其中:步骤1你可能会遇到中文乱码的问题,网上查找可以解决;
步骤2用split安装空格截取后可能会遇到“运营商”字段自带空格的问题,你可以选择把被截成N段的“运营商”字段还原,如果做不到可以暴力一点直接修改txt文件;
步骤3认真听课应该没有问题;
步骤4如果你步骤2处理得好也没有问题;
步骤5如果不知道mysql的inet_aton()和inet_ntoa()函数确实会比较麻烦,但是都做到这一步了,就行你用个between and简单比较相信老师也不会让你被扣学费吧。
如果上面5个步骤你都能完成了,那么也可以考虑考虑效率问题:读一条insert一条还是全部读完再insert? execute多次还是executemany一次?每次commit一条还是一百条一千条甚至是全部数据一次commit?
最后还有一点,老师用4周差不多6个小时讲完了python语法,有好多方面肯定是没有涉及到但有很有用的,比如刚提到的文件操作,建议跟我一样python零基础的同学还是买本书自己补一补,基本语法不熟练以后就算能跟着老师做一些应用也还是不行的。
写了这么多,希望能对大家有用,共同进步。
中级会员, 积分 388, 距离下一级还需 112 积分
论坛徽章:4
楼主好用心,谢谢楼主分享.
新手上路, 积分 29, 距离下一级还需 21 积分
论坛徽章:1
写得不错哟,看起来都是自己打的字
注册会员, 积分 94, 距离下一级还需 106 积分
论坛徽章:3
学得太痛苦了,作业不会做
注册会员, 积分 158, 距离下一级还需 42 积分
论坛徽章:21
学得太痛苦了,作业不会做
只有花时间,没问题的。
你可以按我上面说的一步一步来,比如第一步不会写,就去网上搜“python读取文件”的代码,自己看懂再照着写就行。
新手上路, 积分 38, 距离下一级还需 12 积分
论坛徽章:5
感谢分享指导
注册会员, 积分 123, 距离下一级还需 77 积分
论坛徽章:5
谢谢楼主的分享,楼主真知灼见。评点的很到位。
中级会员, 积分 362, 距离下一级还需 138 积分
论坛徽章:10
先照着敲几遍,慢慢就会了,我现在也是照着敲
中级会员, 积分 285, 距离下一级还需 215 积分
论坛徽章:15
谢谢楼主的分享,楼主用心了
高级会员, 积分 507, 距离下一级还需 493 积分
论坛徽章:14
谢谢分享,数据库操作的效率确实没考虑
dataguru.cn All Right Reserved.
扫一扫加入本版微信群可爱的 Python:Python 中的 TK编程
我想要向您介绍能想像到的开始 GUI 编程的最简单方法,就是使用
Scriptics 的 TK 和 Tkinter 封装器。我们将与
developerWorks
提到的 curses 库进行很多比较。除了 curses
实现文本控制台而 TK 实现 GUI
这一差别之外,这两个库有着惊人相似的接口。在使用任何一个库之前,需要基本了解窗口和事件循环,并参考可用的窗口小部件。(好,好的参考和适量的练习。)
如同关于 curses 的文章,本文仅讨论 Tkinter 本身的特性。既然很多
Python 发行版都带有 Tkinter,因此可能无需下载支持库或其它 Python
模块。本文后面的
指向几个更高级别的用户接口窗口小部件的集合,但是您可以用
Tkinter 本身做许多事,包括构造自己的高级窗口小部件。学习基本
Tkinter 模块将为您引入 TK
的思维方式,即使您继续使用更高级的窗口小部件集合,这种思维方式仍十分重要。
简要描述TK 是与 TCL 语言关系最密切、且被广泛使用的图形库,TCL 语言和 TK
都由 John Ousterhout 开发。虽然 TK 于 1991 年作为 X11
库出现,但实际上它从那时起就被移植到每一种流行的 GUI。(它与 Python
逐渐拥有“标准”GUI
的情形相似。)现在,大多数流行语言和很多小型语言都有 TK
绑定(Tkinter 模块)。在开始之前,我必须承认:我不是瘦小枯干的 TK
编程专家。事实上,我的大部分 TK
编程经验大约从我写这篇文章三天前才开始。那三天并非没有挑战,但是最后我觉得很好地掌握了
Tkinter。我在这里要说的是:TK 和 Tkinter
封装器设计得都非常好,便于用户操作,并且只是关于 GUI
编程最简单的介绍。从测试应用程序开始我们将使用 Txt2Html,这个在以前很多专栏(请参阅
)中使用的文件格式转换程序,的封装器作为测试应用程序。虽然可以用几种方式运行
Txt2Html,但这里的封装器却要从命令行运行
Txt2Html。该应用程序以批处理进程的形式运行,并带有指出要执行的转换各方面特性的命令行自变量。(以后,最好为用户提供交互式选择屏幕选项,以在执行实际转换之前引导用户逐步选择不同的转换选项并提供所选选项的可视反馈。)
tk_txt2html
基于带有下拉菜单和嵌套子菜单的顶部菜单。旁边有详细的实现说明,它看起来与在
中讨论的 curses 版本很相象。虽然 TK
用较少的代码可以实现更多的功能,但很明显,tk_txt2html 和
curses_txt2html 很相似。例如,在 TK
中,象菜单这样的特性可以依靠内置的 Tkinter
类实现,而无需从头编写。
除了设置配置选项之外,TK 封装器还包括一个与 TK Text
窗口小部件一起构建的滚动帮助框(一个带有 Message
窗口小部件的“关于”框)和一个进行 TK
动态几何管理的历史窗口。与大多数交互式应用程序一样,封装器用 TK 的
Entry 窗口小部件接受某些用户输入。在进一步讨论代码之前,让我们看一下实际运行中的应用程序。学习基本知识
实际上,Tkinter 程序只需做三件事:最小的 [Tkinter] 程序import Tkinter # import the Tkinter module
root = Tkinter.Tk() # create a root window
root.mainloop() # create an event loop这是一个完全有效的 Tkinter 程序(不要介意它没有实际用处,因为它甚至不管理 "hello world")。该程序唯一需要做的是创建一些容纳其根窗口的窗口小部件。这样增强之后,无需程序员进一步干涉,该程序的 root
.mainloop() 方法调用就可以处理所有用户交互。
函数现在,我们看一下 tk_txt2html.py 更现实的 main()
函数。请注意,我更喜欢使用 John Grayson 的
Tkinter 语句,而不是
from Tkinter
import (请参阅
中所列的他的书籍)。这不是因为我担心名称空间的干扰(
from ... import 语句的通常警告),而是因为我想明确使用
类;我不想冒险将它们与我自己的函数和类相混淆)。建议您也这样做,至少在开始时这样做。
tk_txt2html main() 函数def main():
global root, history_frame, info_line
root = Tkinter.Tk()
root.title('Txt2Html TK Shell')
init_vars()
#-- Create the menu frame, and menus to the menu frame
menu_frame = Tkinter.Frame(root)
menu_frame.pack(fill=Tkinter.X, side=Tkinter.TOP)
menu_frame.tk_menuBar(file_menu(), action_menu(), help_menu())
#-- Create the history frame (to be filled in during runtime)
history_frame = Tkinter.Frame(root)
history_frame.pack(fill=Tkinter.X, side=Tkinter.BOTTOM, pady=2)
#-- Create the info frame and fill with initial contents
info_frame = Tkinter.Frame(root)
info_frame.pack(fill=Tkinter.X, side=Tkinter.BOTTOM)
# first put the column labels in a sub-frame
LEFT, Label = Tkinter.LEFT, Tkinter.Label # shortcut names
label_line = Tkinter.Frame(info_frame, relief=Tkinter.RAISED, borderwidth=1)
label_line.pack(side=Tkinter.TOP, padx=2, pady=1)
Label(label_line, text="Run #", width=5).pack(side=LEFT)
Label(label_line, text="Source:", width=20).pack(side=LEFT)
Label(label_line, text="Target:", width=20).pack(side=LEFT)
Label(label_line, text="Type:", width=20).pack(side=LEFT)
Label(label_line, text="Proxy Mode:", width=20).pack(side=LEFT)
# then put the "next run" information in a sub-frame
info_line = Tkinter.Frame(info_frame)
info_line.pack(side=Tkinter.TOP, padx=2, pady=1)
update_specs()
#-- Finally, let's actually do all that stuff created above
root.mainloop()在这个简单的
main() 函数中有几件事要注意:
每一个窗口小部件都有一个父代。每当创建窗口小部件时,传递给实例创建的第一个自变量是新的窗口小部件的父代。如果有其它窗口小部件创建自变量,将通过名称传递它们。Python
的这一特性给我们以指定选项或允许它们取缺省值的极大灵活性。有几个窗口小部件实例 (Frame)
是全局变量。可以通过在函数间传递变量来使它们成为本地变量,以便维护代码范围的理论纯洁性,但是与它的实际用处相比过于麻烦。另外,使这些基本的
元素全局化强调了这样一个事实:它们可以在整个函数中使用。但是,要确保对自己的全局变量使用良好的命名规范。(事先给您一个警告,Python
人员看起来讨厌匈牙利符号。)创建完窗口小部件之后,我们调用一个几何图形管理器来让 TK
知道在哪里放置窗口小部件。TK
在计算细节信息时有许多魔力,特别是当调整窗口大小或动态添加窗口小部件时更是如此。但是在任何情况下,都需要让
TK 知道使用哪套咒语。应用几何图形管理器TK
提供三个几何图形管理器:
.pack() 、
.place() 。虽然
可用于精细(换句话说,非常复杂)的控制,但 tk_txt2html
只使用头两个。大多数时候,您将使用
.pack() 。
当然,可以不带自变量来调用
方法。但是如果那样做,窗口小部件可能会在显示屏幕的某处结束,您可能也想为
.pack() 提供一些提示。这些提示中最重要的是
side 自变量。可能的值是 LEFT、RIGHT、TOP 和
BOTTOM(请注意这些是 Tkinter 名称空间中的变量)。
的许多魔力来自可以将窗口小部件嵌套这一事实。特别的,除了作为其它窗口小部件的容器(它有时显示不同类型的边界)之外,Frame
窗口小部件几乎不作什么。这样,就可以很方便地在所希望的方向排列几个框架,然后在每个框架中添加其它窗口小部件。按照调用框架(以及其它窗口小部件)的
方法的顺序来排列它们。因此,如果两个窗口小部件都请求
side=TOP ,则满足先进入的请求。
tk_txt2html 还偶尔使用
.grid() 。grid
几何图形管理器用可视的坐标线覆盖父代窗口小部件。当窗口小部件调用
.grid(row=3, column=4)
时,它请求其父代将它放在第三行第四列上。通过查看父代的所有子代的请求来计算父代的总行数和总列数。
别忘了对自己的窗口小部件应用几何图形管理器,以免在显示屏幕上看不到它们时后悔莫及。菜单Tkinter
能轻易生成菜单。虽然我们在这里使用十分简单的示例,但是如果愿意,还可以用不同的字体、图形、复选框和各种别致的子代窗口小部件来填充菜单。在我们的示例中,tk_txt2html
的菜单全部用我们在上面所见的行创建。menu_frame.tk_menuBar(file_menu(), action_menu(), help_menu())这行本身可能有些神秘。大多数必须完成的工作位于名为
*_menu() 的函数中。让我们看一下最简单的示例。
创建下拉菜单def help_menu():
help_btn = Tkinter.Menubutton(menu_frame, text='Help', underline=0)
help_btn.pack(side=Tkinter.LEFT, padx="2m")
help_btn.menu = Tkinter.Menu(help_btn)
help_btn.menu.add_command(label="How To", underline=0, command=HowTo)
help_btn.menu.add_command(label="About", underline=0, command=About)
help_btn['menu'] = help_btn.menu
return help_btn下拉菜单是将 Menu 小窗口部件作为子代的 Menubutton
小窗口部件。
.pack() (或
.grid() 等)将
Menubutton 排列在适当的位置。Menu 小窗口部件用
.add_command() 方法添加项。(请注意上面为 Menubutton
的目录所作的奇怪分配。不要问为什么,跟着我这样做并在您自己的代码中也这样做即可。)
获得用户输入下面将看到的示例演示 Label 小窗口部件 widget 如何显示输入(有关
Text 和 Message 小窗口部件的某些示例的完整资源,请参阅
)。字段输入的基本小窗口部件是
Entry。它易于使用,但是如果以前曾使用过 Python 的
raw_input() 或 curses 的
.getstr() ,您将发现技巧略有不同。TK 的 Entry
小窗口部件不返回可分配的值。相反,它获取自变量来填充字段对象。例如,下面的函数允许用户指定输入文件。
接受用户字段输入def GetSource():
get_window = Tkinter.Toplevel(root)
get_window.title('Source File?')
Tkinter.Entry(get_window, width=30,
textvariable=source).pack()
Tkinter.Button(get_window, text="Change",
command=lambda: update_specs()).pack()这里有几件事要注意。我们为这个输入创建了一个新的 Toplevel 小窗口部件和对话框,并且通过创建一个带有
textvariable 自变量的 Entry 小窗口部件指定了输入字段。但是等一下,还有件事!
textvariable
自变量没有指定简单的字符串变量。相反,它引用一个 StringVar
对象。在我们的示例中,从
main() 调用的
init_vars() 函数包含三行。
source = Tkinter.StringVar()
source.set('txt2html.txt')这创建了一个适用于用户输入的对象并为其分配了初始值。每次在与之相链接的 Entry 小窗口部件中进行更改时都立即修改该对象。每次在 Entry 小窗口部件中击键、而不是读取终止时,都进行
raw_input() 样式的更改。
要想获得户输入的值,我们使用 StringVar 实例的
.get() 方法。例如:
source_string = source.get()结束语此处所略述的技巧以及我们在完整的应用程序源代码中使用的技巧应该足以使您开始进行
编程了。略微实践之后您就会发现它不难掌握。有一个好处是:可以通过
Python 以外的很多语言访问 TK 库,因此您使用 Python 的 Tkinter
模块学到的大多数知识可以应用到其它语言。
相关主题要想获得一个好起点,请查看
可以节省您构造复杂
UI 的时间。PMW (Python Mega Widgets) 完全用 Python 编写并广泛用于
Python 社区。
Fredrik Lundh 编写了一个比本文包含更多详细信息的 Tkinter
有几本印刷书籍值得一看。第一本是对 TK
本身所作的很好的介绍。第二本专门讲 Python,并有很多使用 PMW
集合的示例:
TCK/TK in a Nutshell ,Paul Raines 和 Jeff Tranter
著(O'Reilly,1999 年)
Python and Tkinter Programming John E. Grayson
著(Manning,2000 年)
ActiveState 最近创建了一个极佳的
,以及各种其它大多数其它发行版所没有的其它方便的包和模块。他们还为那些倾向于其它脚本语言的人创建了
ActivePerl 发行版。)
重新命名了
维护者和创始人)。
developerWorks 上 David Mertz
撰写的这些相关文章:
添加或订阅评论,请先或。
有新评论时提醒我
static.content.url=http://www.ibm.com/developerworks/js/artrating/SITE_ID=10Zone=LinuxArticleID=21817ArticleTitle=可爱的 Python:Python 中的 TK编程publish-date=学习 Python 很吃力,我是不是可以放弃编程了? - 知乎<strong class="NumberBoard-itemValue" title="被浏览<strong class="NumberBoard-itemValue" title="1,839分享邀请回答914143 条评论分享收藏感谢收起1.6K93 条评论分享收藏感谢收起零基础自学用Python 3开发网络爬虫(一) - 文章 - 伯乐在线
& 零基础自学用Python 3开发网络爬虫(一)
由于本学期好多神都选了Cisco网络课, 而我这等弱渣没选, 去蹭了一节发现讲的内容虽然我不懂但是还是无爱. 我想既然都本科就出来工作还是按照自己爱好来点技能吧, 于是我就不去了. 一个人在宿舍没有点计划好的事情做就会很容易虚度, 正好这个学期主打网络与数据库开发, 那就先学学Python开发爬虫吧. 我失散多年的好朋友Jay Loong突然说他会爬虫了, 我感到真棒, 我也要学 :D 因为一个星期有两节Cisco课, 所以本系列博文也就一周两更。
选择一门语言
爬虫可以用各种语言写, C++, Java都可以, 为什么要Python? 首先用C++搞网络开发的例子不多(可能是我见得太少), 然后由于Oracle收购了Sun, Java目前虽然在Android开发上很重要, 但是如果Google官司进展不顺利, 那么很有可能用Go语言替代掉Java来做Android开发. 在这计算机速度高速增长的年代里, 选语言都要看他爹的业绩, 真是稍不注意就落后于时代. 随着计算机速度的高速发展, 某种语言开发的软件运行的时间复杂度的常数系数已经不像以前那么重要, 我们可以越来越偏爱为程序员打造的而不是为计算机打造的语言. 比如Ruby这种传说中的纯种而又飘逸的的OOP语言, 或者Python这种稍严谨而流行库又非常多的语言, 都大大弱化了针对计算机运行速度而打造的特性, 强化了为程序员容易思考而打造的特性. 所以我选择Python.
选择Python版本
有2和3两个版本, 3比较新, 听说改动大. 根据我在知乎上搜集的观点来看, 我还是倾向于使用”在趋势中将会越来越火”的版本, 而非”目前已经很稳定而且很成熟”的版本. 这是个人喜好, 而且预测不一定准确. 但是如果Python3无法像Python2那么火, 那么整个Python语言就不可避免的随着时间的推移越来越落后, 因此我想其实选哪个的最坏风险都一样, 但是最好回报却是Python3的大. 其实两者区别也可以说大也可以说不大, 最终都不是什么大问题. 我选择的是Python 3.
选择参考资料
由于我是一边学一边写, 而不是我完全学会了之后才开始很有条理的写, 所以参考资料就很重要(本来应该是个人开发经验很重要, 但我是零基础).
这篇非常好, 通俗易懂的总览整个Python学习框架.
写到这里的时候, 上面第二第三个链接的票数第一的回答已经看完了, 他们提到的有些部分(比如爬行的路线不能有回路)我就不写了.
一个简单的伪代码
以下这个简单的伪代码用到了set和queue这两种经典的数据结构, 集与队列. 集的作用是记录那些已经访问过的页面, 队列的作用是进行广度优先搜索.
StartPoint = "http://jecvay.com"
Q.push(StartPoint)
# 经典的BFS开头
S.insert(StartPoint)
# 访问一个页面之前先标记他为已访问
while (Q.empty() == false)
# BFS循环体
T = Q.top()
for point in PageUrl(T)
# PageUrl(T)是指页面T中所有url的集合, point是这个集合中的一个元素.
if (point not in S)
Q.push(point)
S.insert(point)
1234567891011
queue Qset SStartPoint = "http://jecvay.com"Q.push(StartPoint)&&# 经典的BFS开头S.insert(StartPoint)&&# 访问一个页面之前先标记他为已访问while (Q.empty() == false)&&# BFS循环体&&T = Q.top()&&# 并且pop&&for point in PageUrl(T)&&# PageUrl(T)是指页面T中所有url的集合, point是这个集合中的一个元素.&&&&if (point not in S)&&&&&&Q.push(point)&&&&&&S.insert(point)
这个伪代码不能执行,
我觉得我写的有的不伦不类, 不类Python也不类C++.. 但是我相信看懂是没问题的, 这就是个最简单的BFS结构. 我是看了知乎里面的那个伪代码之后, 自己用我的风格写了一遍. 你也需要用你的风格写一遍.
这里用到的Set其内部原理是采用了Hash表, 传统的Hash对爬虫来说占用空间太大, 因此有一种叫做的数据结构更适合用在这里替代Hash版本的set. 我打算以后再看这个数据结构怎么使用, 现在先跳过, 因为对于零基础的我来说, 这不是重点.
代码实现(一): 用Python抓取指定页面
我使用的编辑器是Idle, 安装好Python3后这个编辑器也安装好了, 小巧轻便, 按一个F5就能运行并显示结果. 代码如下:
#encoding:UTF-8
import urllib.request
url = "http://www.baidu.com"
data = urllib.request.urlopen(url).read()
data = data.decode('UTF-8')
print(data)
#encoding:UTF-8import urllib.request&url = "http://www.baidu.com"data = urllib.request.urlopen(url).read()data = data.decode('UTF-8')print(data)
urllib.request是一个库, 隶属urllib. . 官方文档应该怎么使用呢? 首先点刚刚提到的这个链接进去的页面有urllib的几个子库, 我们暂时用到了request, 所以我们先看urllib.request部分. 首先看到的是一句话介绍这个库是干什么用的:
The urllib.request module defines functions and classes which help in opening URLs (mostly HTTP) in a complex world — basic and digest authentication, redirections, cookies and more.
然后把我们代码中用到的urlopen()函数部分阅读完.
urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, capath=None, cadefault=False)
重点部分是返回值, 这个函数返回一个 http.client.HTTPResponse 对象, 这个对象又有各种方法, 比如我们用到的read()方法, 这些方法都可以. 根据官方文档所写, 我用控制台运行完毕上面这个程序后, 又继续运行如下代码, 以更熟悉这些乱七八糟的方法是干什么的.
&&& a = urllib.request.urlopen(full_url)
&&& type(a)
&class ‘http.client.HTTPResponse’&
&&& a.geturl()
‘http://www.baidu.com/s?word=Jecvay’
&&& a.info()
&http.client.HTTPMessage object at 0x&
&&& a.getcode()
123456789101112
&&& a = urllib.request.urlopen(full_url)&&& type(a)&class ‘http.client.HTTPResponse’&&&&& a.geturl()‘http://www.baidu.com/s?word=Jecvay’&&&& a.info()&http.client.HTTPMessage object at 0x&&&&& a.getcode()200
代码实现(二): 用Python简单处理URL
如果要抓取百度上面搜索关键词为Jecvay Notes的网页, 则代码如下
import urllib
import urllib.request
data['word']='Jecvay Notes'
url_values=urllib.parse.urlencode(data)
url="http://www.baidu.com/s?"
full_url=url+url_values
data=urllib.request.urlopen(full_url).read()
data=data.decode('UTF-8')
print(data)
12345678910111213
import urllibimport urllib.request&data={}data['word']='Jecvay Notes'&url_values=urllib.parse.urlencode(data)url="http://www.baidu.com/s?"full_url=url+url_values&data=urllib.request.urlopen(full_url).read()data=data.decode('UTF-8')print(data)
data是一个字典, 然后通过urllib.parse.urlencode()来将data转换为 ‘word=Jecvay+Notes’的字符串, 最后和url合并为full_url, 其余和上面那个最简单的例子相同. 关于urlencode(), 同样通过官方文档学习一下他是干什么的. 通过查看
大概知道他是把一个通俗的字符串, 转化为url格式的字符串.
可能感兴趣的话题
为什么抓取的页面,中文显示不出来,并且显示错误:UnicodeEncodeError: 'gbk' codec can't encode character '\xbb' in position 23475:illegal multibyte sequence。在网上搜索了很久,也没有解决。我是在Windows环境下编码的。
关于伯乐在线博客
在这个信息爆炸的时代,人们已然被大量、快速并且简短的信息所包围。然而,我们相信:过多“快餐”式的阅读只会令人“虚胖”,缺乏实质的内涵。伯乐在线内容团队正试图以我们微薄的力量,把优秀的原创文章和译文分享给读者,为“快餐”添加一些“营养”元素。
新浪微博:
推荐微信号
(加好友请注明来意)
&#8211; 好的话题、有启发的回复、值得信赖的圈子
&#8211; 分享和发现有价值的内容与观点
&#8211; 为IT单身男女服务的征婚传播平台
&#8211; 优秀的工具资源导航
&#8211; 翻译传播优秀的外文文章
&#8211; 国内外的精选文章
&#8211; UI,网页,交互和用户体验
&#8211; 专注iOS技术分享
&#8211; 专注Android技术分享
&#8211; JavaScript, HTML5, CSS
&#8211; 专注Java技术分享
&#8211; 专注Python技术分享
& 2018 伯乐在线如何系统地自学 Python? - 知乎<strong class="NumberBoard-itemValue" title="3被浏览<strong class="NumberBoard-itemValue" title=",601,906分享邀请回答Extend Python 2.7 life till 2020. · python/peps@f824620github.com一些问答:问:为什么笔记不是Python 3?答:我14年学的时候用的Python 2,那时候还很流行。问:建议升级成Python 3?答:谢谢,没时间搞,将就一下,将就不了请您考虑别家。问:书跟笔记有什么区别?答:笔记是随手记的,遗漏错误什么的在所难免;书是系统写的,补充了很多基本概念跟详细的讲解,还有一些原来没有的内容,所以还是要更丰富些的。当然不想买,您就看笔记凑合一下,没人拦着您不让看。问:Python 2和3的核心区别?答:个人理解,Python 2和3影响比较大的几点核心区别在于:print函数整数除法Unicode字符串xrange和range迭代器从.next()方法变成next()函数调用一些原来返回列表的函数返回迭代器变量作用域(比如for循环)除了上述提到的区别(影响基础和进阶的部分),不影响NumPy、SciPy、Matplotlib、Pandas等后续模块的学习,3虽然不兼容2,但是总体的用法并没有太多改变。问:笔记为什么打不开?答:网络问题或者代码托管网站的问题(如网址更新等),不负责修复。问:为什么某些代码运行不了/有错误?答:所有的代码我都运行过,可能会存在一定的版本兼容问题(Python 3运行2的代码或者相应的工具包版本不一致),不负责修复。问:有错别字或者版本更新带来的不一致现象?答:谢谢提醒,不负责修复。Python 其实挺简单的,也挺强大的。我用 Python 做科学计算,自学一年,也记了一年的笔记。笔记链接(基于Python 2.7):Github:Nbviewer:网页: 笔记目录:13K344 条评论分享收藏感谢收起learnpythonthehardway.org/book/这本书在讲解 Python 的语法成分时,还附带大量可实践的例子,非常适合快速起步。?「廖雪峰的 Python 2.7 教程」:Python 中文教程的翘楚,专为刚刚步入程序世界的小白打造。?「The Hitchhiker’s Guide to Python!」:这本指南着重于 Python 的最佳实践,不管你是 Python 专家还是新手,都能获得极大的帮助。?「Python 官方文档」:实践中大部分问题,都可以在官方文档中找到答案。? 辅助工具:一个 Python 对象可视化的项目,用图形辅助你理解 Python 中的各种概念。Python 的哲学:用一种方法,最好是只有一种方法来做一件事。学习也是一样,虽然推荐了多种学习资料,但实际学习的时候,最好只选择其中的一个,坚持看完。必要的时候,可能需要阅读讲解数据结构和算法的书,这些知识对于理解和使用 Python 中的对象模型有着很大的帮助。°2 软知识“软知识”则是特定语言环境下的语法技巧、类库的使用、IDE的选择等等。这一部分,即使完全不了解不会使用,也不会妨碍你去编程,只不过写出的程序,看上去显得“傻”了些。对这些知识的学习,取决于你尝试解决的问题的领域和深度。对初学者而言,起步阶段极易走火,或者在选择 Python 版本时徘徊不决,一会儿看 2.7 一会儿又转到 3.0,或者徜徉在类库的大海中无法自拔,Scrapy,Numpy,Django 什么都要试试,或者参与编辑器圣战、大括号缩进探究、操作系统辩论赛等无意义活动,或者整天跪舔语法糖,老想着怎么一行代码把所有的事情做完,或者去构想圣洁的性能安全通用性健壮性全部满分的解决方案。很多“大牛”都会告诫初学者,用这个用那个,少走弯路,这样反而把初学者推向了真正的弯路。还不如告诉初学者,学习本来就是个需要你去走弯路出 Bug,只能脚踏实地,没有奇迹只有狗屎的过程。选择一个方向先走下去,哪怕脏丑差,走不动了再看看有没有更好的解决途径。自己走了弯路,你才知道这么做的好处,才能理解为什么人们可以手写状态机去匹配却偏要发明正则表达式,为什么面向过程可以解决却偏要面向对象,为什么我可以操纵每一根指针却偏要自动管理内存,为什么我可以嵌套回调却偏要用 Promise...更重要的时,你会明白,高层次的解决方法都是对低层次的封装,并不是任何情况下都是最有效最合适的。技术涌进就像波浪一样,那些陈旧的封存已久的技术,消退了迟早还会涌回的。就像现在移动端应用、手游和 HTML5 的火热,某些方面不正在重演过去 PC 的那些历史么?因此,不要担心自己走错路误了终身,坚持并保持进步才是正道。起步阶段的核心任务是掌握硬知识,软知识做适当了解,有了稳固的根,粗壮的枝干,才能长出浓密的叶子,结出甜美的果实。? 发展阶段完成了基础知识的学习,必定会感到一阵空虚,怀疑这些语法知识是不是真的有用。没错,你的怀疑是非常正确的。要让 Python 发挥出它的价值,当然不能停留在语法层面。发展阶段的核心任务,就是“跳出 Python,拥抱世界”。在你面前会有多个分支:科学计算和数据分析、爬虫、Web 网站、游戏、命令行实用工具等等等等,这些都不是仅仅知道 Python 语法就能解决的问题。拿爬虫举例,如果你对计算机网络,HTTP协议,HTML,文本编码,JSON一无所知,你能做好这部分的工作么?而你在起步阶段的基础知识也同样重要,如果你连循环递归怎么写都还要查文档,连 BFS 都不知道怎么实现,这就像工匠做石凳每次起锤都要思考锤子怎么使用一样,非常低效。在这个阶段,不可避免要接触大量类库,阅读大量书籍的。°1 类库方面「Awesome Python 项目」:这里列出了你在尝试解决各种实际问题时,Python 社区已有的工具型类库,如下图所示:你可以按照实际需求,寻找你需要的类库。至于相关类库如何使用,必须掌握的技能便是阅读文档。由于开源社区大多数文档都是英文写成的,所以,英语不好的同学,需要恶补下。°2 书籍方面:这里我只列出一些我觉得比较有一些帮助的书籍,详细的请看豆瓣的书评:科学和数据分析:?「集体智慧编程」:?「数学之美」:?「统计学习方法」:?「Pattern Recognition And Machine Learning」:?「数据科学实战」:?「数据检索导论」:爬虫:?「HTTP 权威指南」:Web 网站:?「HTML & CSS 设计与构建网站」:... 列到这里已经不需要继续了。聪明的你一定会发现上面的大部分书籍,并不是讲 Python 的书,而更多的是专业知识。事实上,这里所谓“跳出 Python,拥抱世界”,其实是发现 Python 和专业知识相结合,能够解决很多实际问题。这个阶段能走到什么程度,更多的取决于自己的专业知识。? 深入阶段这个阶段的你,对 Python 几乎了如指掌,那么你一定知道 Python 是用 C 语言实现的。可是 Python 对象的“动态特征”是怎么用相对底层,连自动内存管理都没有的C语言实现的呢?这时候就不能停留在表面了,勇敢的拆开 Python 的黑盒子,深入到语言的内部,去看它的历史,读它的源码,才能真正理解它的设计思路。这里推荐一本书:「Python 源码剖析」:这本书把 Python 源码中最核心的部分,给出了详细的阐释,不过阅读此书需要对 C 语言内存模型和指针有着很好的理解。另外,Python 本身是一门杂糅多种范式的动态语言,也就是说,相对于 C 的过程式、 Haskell 等的函数式、Java 基于类的面向对象而言,它都不够纯粹。换而言之,编程语言的“道学”,在 Python 中只能有限的体悟。学习某种编程范式时,从那些面向这种范式更加纯粹的语言出发,才能有更深刻的理解,也能了解到 Python 语言的根源。这里推荐一门公开课「编程范式」:讲师高屋建瓴,从各种编程范式的代表语言出发,给出了每种编程范式最核心的思想。值得一提的是,这门课程对C语言有非常深入的讲解,例如C语言的范型和内存管理。这些知识,对阅读 Python 源码也有大有帮助。Python 的许多最佳实践都隐藏在那些众所周知的框架和类库中,例如 Django、Tornado 等等。在它们的源代码中淘金,也是个不错的选择。?
最后的话每个人学编程的道路都是不一样的,其实大都殊途同归,没有迷路的人只有不能坚持的人。虽然听上去有点鸡汤,但是这是事实。希望想学 Python 想学编程的同学,不要犹豫了,看完这篇文章,Just getting started~另外,欢迎私信本喵交流 Python 的学习经验哦 & .&4.7K100 条评论分享收藏感谢收起

我要回帖

更多关于 python自学看什么书 的文章

 

随机推荐