Python&3.3.0入门教程
本文适合有经验的程序员尽快进入Python世界.特别地,如果你掌握Java和Javascript,不用1小时你就可以用Python快速流畅地写有用的Python程序.&
为什么使用Python?
假设我们有这么一项任务:简单测试局域网中的电脑是否连通.这些电脑的ip范围从192.168.0.101到192.168.0.200.&
思路:用shell编程.(Linux通常是bash而Windows是批处理脚本).例如,在Windows上用ping&ip&的命令依次测试各个机器并得到控制台输出.由于ping通的时候控制台文本通常是"Reply&from&...&"&而不通的时候文本是"time&out&...&"&,所以,在结果中进行字符串查找,即可知道该机器是否连通.
实现:Java代码如下:
String&cmd="cmd.exe&ping&";
String&ipprefix="192.168.10.";
int&begin=101;
int&end=200;
Process&p=
for(int&i=i
p=&Runtime.getRuntime().exec(cmd+i);
String&line&=&
BufferedReader&reader&=&new&BufferedReader(new&InputStreamReader(p.getInputStream()));
while((line&=&reader.readLine())&!=&null)
//Handling&line&,&may&logs&it.&
reader.close();
p.destroy();
这段代码运行得很好,问题是为了运行这段代码,你还需要做一些额外的工作.这些额外的工作包括:
编写一个类文件&
编写一个main方法&
将之编译成字节代码&
由于字节代码不能直接运行,你需要再写个小小的bat或者bash脚本来运行.
当然,用C/C++同样能完成这项工作.但C/C++不是跨平台语言.在这个足够简单的例子中也许看不出C/C++和Java实现的区别,但在一些更为复杂的场景,比如要将连通与否的信息记录到网络数据库.由于Linux和Windows的网络接口实现方式不同,你不得不写两个函数的版本.用Java就没有这样的顾虑.
同样的工作用Python实现如下:
import&subprocess
cmd="cmd.exe"
while&begin
p=subprocess.Popen(cmd,shell=True,stdout=subprocess.PIPE,
stdin=subprocess.PIPE,
stderr=subprocess.PIPE)
p.stdin.write("ping&192.168.1."+str(begin)+"\n")
p.stdin.close()
print&"execution&result:&%s"%p.stdout.read()
对比Java,Python的实现更为简洁,你编写的时间更快.你不需要写main函数,并且这个程序保存之后可以直接运行.另外,和Java一样,Python也是跨平台的.
有经验的C/Java程序员可能会争论说用C/Java写会比Python写得快.这个观点见仁见智.我的想法是当你同时掌握Java和Python之后,你会发现用Python写这类程序的速度会比Java快上许多.例如操作本地文件时你仅需要一行代码而不需要Java的许多流包装类.各种语言有其天然的适合的应用范围.用Python处理一些简短程序类似与操作系统的交互编程工作最省时省力.
--------------------------------------------------------------------------------
Python应用场合
足够简单的任务,例如一些shell编程.如果你喜欢用Python设计大型商业网站或者设计复杂的游戏,悉听尊便.
--------------------------------------------------------------------------------
2&快速入门
2.1&Hello&world
***完Python之后(我本机的版本是2.5.4),打开IDLE(Python&GUI)&,&该程序是Python语言解释器,你写的语句能够立即运行.我们写下一句著名的程序语句:
print&("Hello,world!")或者&print&('hello,world!')&&&//必须有括号,不然是语法错误
并按回车.你就能看到这句被K&R引入到程序世界的名言.
在解释器中选择"File"--"New&Window"&或快捷键&Ctrl+N&,&打开一个新的编辑器.写下如下语句:
print&"Hello,world!"
raw_input("Press&enter&key&to&close&this&window");
保存为a.py文件.按F5,你就可以看到程序的运行结果了.这是Python的第二种运行方式.
找到你保存的a.py文件,双击.也可以看到程序结果.Python的程序能够直接运行,对比Java,这是一个优势.
--------------------------------------------------------------------------------
2.2&国际化支持
我们换一种方式来问候世界.新建一个编辑器并写如下代码:
#coding=UTF-8&&&&&&&&&&&&&&&//必须告诉eclipse你的编码方式,而不是默认的ASCII码方式,或者用eclipse直接指定编码,不用再手动指定。
print&('中国人')print&"欢迎来到奥运中国!"
raw_input("Press&enter&key&to&close&this&window");
在你保存代码的时候,Python会提示你是否改变文件的字符集,结果如下:
#&-*-&coding:&cp936&-*-&
print&"欢迎来到奥运中国!"
raw_input("Press&enter&key&to&close&this&window");
将该字符集改为我们更熟悉的形式:
#&-*-&coding:&GBK&-*-&
print&"欢迎来到奥运中国!"&使用中文的例子
raw_input("Press&enter&key&to&close&this&window");
程序一样运行良好.
--------------------------------------------------------------------------------
2.3&方便易用的计算器
用微软附带的计算器来计数实在太麻烦了.打开Python解释器,直接进行计算:
print&((a+b+c)/c)&&&//在外面一定还要加一层括号,否则会出现TypeError:&unsupported&operand&type(s)&for&/:&'NoneType'&and&'int'的错误提示
--------------------------------------------------------------------------------
2.4&字符串,ASCII和UNICODE
可以如下打印出预定义输出格式的字符串:
Usage:&thingy&[OPTIONS]
-h&Display&this&usage&message
-H&hostname&Hostname&to&connect&to
字符串是怎么访问的?请看这个例子:
word="abcdefg"
print&("a&is:&"+a)
b=word[1:3]
print&("b&is:&"+b)&index&1&and&2&elements&of&word.
c=word[:2]
print&("c&is:&"+c)&index&0&and&1&elements&of&word.
d=word[0:]
print&("d&is:&"+d)&All&elements&of&word.
e=word[:2]+word[2:]
print&("e&is:&"+e)&All&elements&of&word.
f=word[-1]
print&("f&is:&"+f)&The&last&elements&of&word.
g=word[-4:-2]
print&("g&is:&"+g)&index&3&and&4&elements&of&word.
h=word[-2:]
print&("h&is:&"+h)&The&last&two&elements.
i=word[:-2]
print&("i&is:&"+i)&Everything&except&the&last&two&characters
l=len(word)
print&("Length&of&word&is:&"+&str(l))
请注意ASCII和UNICODE字符串的区别:
print&("Input&your&Chinese&name:")
s=input("Press&enter&to&be&continued");
print&("Your&name&is&&:&"&+s)
print&("Length&of&your&Chinese&name&in&asc&codes&is:"+str(l))
a=(s,'GBK');
print&("I'm&sorry&we&should&use&unicode&char!Characters&number&of&your&Chinese&\
name&in&unicode&is:"+str(l))
--------------------------------------------------------------------------------
2.5&使用List
类似Java里的List,这是一种方便易用的数据类型:
word=['a','b','c','d','e','f','g']
print&("a&is:&"+a)
b=word[1:3]
print&("b&is:&")
print&(b)&index&1&and&2&elements&of&word.
c=word[:2]
print&("c&is:&")
print&(c)&index&0&and&1&elements&of&word.
d=word[0:]
print&("d&is:&")
print&(d)&All&elements&of&word.
e=word[:2]+word[2:]
print&("e&is:&")
print&(e)&All&elements&of&word.
f=word[-1]
print&("f&is:&")
print&(f)&The&last&elements&of&word.
g=word[-4:-2]
print&("g&is:&")
print&(g)&index&3&and&4&elements&of&word.
h=word[-2:]
print&("h&is:&")
print&(h)&The&last&two&elements.
i=word[:-2]
print&("i&is:&")
print&(i)&Everything&except&the&last&two&characters
l=len(word)
print&("Length&of&word&is:&"+&str(l))
print&("Adds&new&element")
word.append('h')
print&(word)
--------------------------------------------------------------------------------
2.6&条件和循环语句
#&Multi-way&decision
x=int(input("Please&enter&an&integer:"))
&&&&x=0&&&
&&&&print&("Negative&changed&to&zero")
elif&x==0:
&&&&print&("Zero")
&&&&print&("More")
#&Loops&List
a&=&['cat',&'window',&'defenestrate']
for&x&in&a:
&&&&print&(x,len(x))
--------------------------------------------------------------------------------
2.7&如何定义函数
#&Define&and&invoke&function.
def&sum(a,b):
&&&&return&(a+b)&&&&//缩进很严谨
func&=&sum
r&=&func(5,6)
#&Defines&function&with&default&argument
def&add(a,b=2):
&&&&return&a+b
r=add(1,5)
并且,介绍一个方便好用的函数:
#&The&range()&function
a&=range(5,10)
a&=&range(-2,-7)
a&=&range(-7,-2)
a&=&range(-2,-11,-3)&The&3rd¶meter&stands&for&step
--------------------------------------------------------------------------------
2.8&文件I/O
spath="F:/baa.txt"
#&Opens&file&for&writing.
#Creates&this&file&doesn't&exist.
f=open(spath,"w")&
f.write("First&line&1.\n")
f.writelines("First&line&2.")
f=open(spath,"r")&Opens&file&for&reading
for&line&in&f:
&&&&print&(line)
--------------------------------------------------------------------------------
2.9&异常处理
s=input("Input&your&age:")
if&s&=="":
&&&&raise&Exception("Input&must&no&be&empty.")
&&&&i=int(s)
except&ValueError:
&&&&print&("Could¬&convert&data&to&an&integer.")
except:&&&&print&("Unknown&exception!")
else:&It&is&useful&for&code&that&must&be&executed&if&the&try&clause&does¬&raise&an&exception
&&&&print&("You&are&%d"&%&i,"&years&old")
finally:&Clean&up&action
&&&&print&("Goodbye!")
--------------------------------------------------------------------------------
2.10&类和继承
python&中&类的私有对象要用self来做前缀引用,如上例中的self.name等等。而一个类的公用变量这用类名做前缀来引用。比如上例中的SchoolMember.count。类的公用变量,跟Java&中的static变量一样,被类的所有实例共享。
另外&python&中类的构造函数&默认名字为&__init()__,左右都是双下横线,类实例化是解释器自动首先调用。同C++一样,Python有一个析构函数__del()__,实例被del时,自动调用该析构函数。
如果要求打印不换行,则需要&print(your_str,end='')
class&Base:
&&&&def&__init__(self):
&&&&&&&&self.data&=&[]
#这里定义add函数必须进行缩进,不然会提示:AttributeError:&'Child'&object&has&no&attribute&'add'
#python就是用缩进代替java的{},也就是以缩进来判断方法的结束。
&&&&def&add(self,&x):
&&&&&&&&self.data.append(x)
&&&&def&addtwice(self,&x):
&&&&&&&&self.add(x)
&&&&&&&&self.add(x)
#&Child&extends&Base
class&Child(Base):
&&&&def&plus(self,a,b):
&&&&&&&&return&a+b
oChild&=Child()
oChild.add("str1")
print&(oChild.data)
print&(oChild.plus(2,3))
#另一个实例
class&SchoolMember:
&&&&'''Represents&any&school&member.'''
&&&&count&=&0
&&&&def&__init__(self,name,age):
&&&&&&&&self.name&=&name
&&&&&&&&self.age&=&age
&&&&&&&&SchoolMember.count&+=&1
&&&&&&&&print('(Initialized&SchoolMember:&%s)'&%&self.name)
&&&&def&tell(self):
&&&&&&&&'''Tell&my&details.'''
&&&&&&&&print('''Name:"%s"&Age:"%s"'''&%(self.name,self.age),end='&'),
class&Teacher(SchoolMember):
&&&&'''Represents&a&&teacher.'''
&&&&def&__init__(self,name,age,salary):
&&&&&&&&SchoolMember.__init__(self,name,age)
&&&&&&&&self.salary&=&salary
&&&&&&&&print('(Initialized&Teacher:&%s)'&%self.name)
&&&&def&tell(self):
&&&&&&&&SchoolMember.tell(self)
&&&&&&&&print(',Salary:&"%d"'&%self.salary)
class&Student(SchoolMember):
&&&&'''Represents&a&student.'''
&&&&def&__init__(self,name,age,marks):
&&&&&&&&SchoolMember.__init__(self,name,age)
&&&&&&&&self.marks&=&marks
&&&&&&&&print('(Initialized&Student:&%s)'&%&self.name)
&&&&def&tell(self):
&&&&&&&&SchoolMember.tell(self)
&&&&&&&&print('Marks:&"%d"'&%&self.marks)
t&=&Teacher('Mr',40,30000)
s&=&Student('Qi&Jiang',23,83)
print(SchoolMember.count)
members&=&[t,s]
for&member&in&members:
&&&&member.tell()
--------------------------------------------------------------------------------
2.11&包机制
每一个.py文件称为一个module,module之间可以互相导入.
请参看以下例子:
def&add_func(a,b):
&&&&return&a+b
from&a&import&add_func&Also&can&be&:&import&a
print&("Import&add_func&from&module&a")
print&("Result&of&1&plus&2&is:&")
#&If&using&"import&a"&,&then&here&should&be&"a.add_func"
print&(add_func(1,2))&&&
module可以定义在包里面.Python定义包的方式稍微有点古怪,假设我们有一个parent文件夹,该文件夹有一个child子文件夹.child中有一个module&a.py&.&如何让Python知道这个文件层次结构?很简单,每个目录都放一个名为_init_.py&的文件.该文件内容可以为空.这个层次结构如下所示:&parent&
--__init_.py
--&__init_.py
那么Python如何找到我们定义的module?在标准包sys中,path属性记录了Python的包路径.你可以将之打印出来:
import&sys
print&(sys.path)
通常我们可以将module的包路径放到环境变量PYTHONPATH中,该环境变量会自动添加到sys.path属性.另一种方便的方法是编程中直接指定我们的module路径到sys.path&中:
import&sys
print(sys.path)
sys.path.append('XXXX')
from&a&import&add_func
print&(sys.path)
print&("Import&add_func&from&module&a")
print&("Result&of&1&plus&2&is:&")
print&(add_func(1,2))
--------------------------------------------------------------------------------
总结你会发现这个教程相当的简单.许多Python特性在代码中以隐含方式提出,这些特性包括:Python不需要显式声明数据类型,关键字说明,字符串函数的解释等等.我认为一个熟练的程序员应该对这些概念相当了解,这样在你挤出宝贵的一小时阅读这篇短短的教程之后,你能够通过已有知识的迁移类比尽快熟悉Python,然后尽快能用它开始编程.
当然,1小时学会Python颇有哗众取宠之嫌.确切的说,编程语言包括语法和标准库.语法相当于武术招式,而标准库应用实践经验则类似于内功,需要长期锻炼.Python学习了Java的长处,提供了大量极方便易用的标准库供程序员"拿来主义".(这也是Python成功的原因),在开篇我们看到了Python如何调用Windows&cmd的例子.
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。离第十赛季开启还有:
关注死灵法师与2.6.0补丁
端午节到了,今天你吃粽子了吗?凯恩之角值此端午佳节之际祝广大的暗黑3玩家们端午安康,阖家团圆。如果你没有吃到粽子的话,来这里可以吃到凯恩之角独有的“包子”哦!
紧急情况!凯恩之角老版主papercutzg(张弓)近日在健身房中意外致伤,造成颅脑大面积出血,已经经历了三次手术,目前还未恢复意识。现医疗费用告急,我们希望有能力的玩家能够一起帮助他度过难关。张弓,加油!
圣教军是暗黑3资料片“夺魂之镰”新加入的职业,和其他职业不同,圣教军一直给人一种庄重圣洁的感觉,不过今天我们要和大家分享的则是国外暗黑粉丝valkyrie的毁灭型圣教军COS,下面就和我们一起欣赏一番吧。
四月底暴雪针对一款未公布的手游项目发布了一条软件工程师的招聘信息,其中多次出现“手游开发经验”、“移动平台”等招聘要求。不仅如此,正文中还出现了“魔兽IP”这一重磅字样,暴雪手游新项目或已呼之欲出。
本周,国服第10赛季全职业的单人极限层再次携手破百。而四人小队体系也发生了新变种,爆狗流魂弹巫医崛起并统治了国服四人小队的前列队伍,另外,由于牛关大法的发掘利用,电蛇法师在宝石配备上也稍有改动。
本周暴雪全家桶更新如下:守望先锋迎来一周年庆典,畅玩版与典藏版均大幅降价,走考拉海购通道,另享折扣!风暴英雄收个迎新礼包上限,皮肤坐骑强化剂应有尽有!魔兽世界假日活动开启!星际争霸2迎来3.14版本
可以说本赛季最大的意外收获就是散件魂弹巫医的异军突起,而自魂弹巫医崛起以来,在凯恩关于其流派、配装、手法的探讨便一直争论不休,今天就为大家带来一篇相对全面的魂弹巫医攻略,新手们快来学习了。
版本交替,几度更迭,魔法师从最初的版本至今已建立了一部绵长的王朝史。而2.4.3版本中马戒的更新又在仙塞学院掀起了新的王朝革命,数个版本以后,电疗系或许也将作为法师历史上的一大超级王朝被写入史册。
昨天我们重温了催泪走心的《乔汉娜的自语》,那今天就一起来欣赏暗黑3五周年活动中荣膺“最佳段子手”的帖子吧,本文以一个倒卖装备的玩具大王为视角,在嬉笑怒骂中回忆5年暗黑3生涯。
近日,死灵法师的套装输出能力被大幅度提升,但是相对的是其减伤依旧吃紧,这使得他在高层的生存能力堪忧。那么,在专家模式中死灵法师该如何生存呢?来看看leonking推荐的超硬散件尸爆流吧。
暗黑3五周年的活动已落下帷幕,今天为大家带来的是在本次活动中荣膺“催泪走心奖”的故事作品。作品以圣教军传承的名号乔汉娜为视角出发,虚构了她在导师墓前的自语的场景,回忆五年的暗黑生涯与如风往事。
5月24日,死灵法师测试服务器上线了一个新的平衡补丁,该补丁全面增强了死灵法师的套装及部分散件效果,不过却稍稍削弱了此前大火的毒镰刀。如果你想了解详细改动可以进入论坛玩家雪暴君的翻译帖查看。
本周,围绕魂弹巫医建立的组队体系又有了大变动,100%的爆狗流增伤术让魂弹的输出更上一层楼,并几乎对国服赛季组队模式的前列队伍完成屠榜。那么所谓的爆狗流该如何配装,又需要怎样的操作手法呢?
圣教军是暗黑3资料片新加入的职业,也是目前六大职业中最“年轻”的职业。圣教军这儿职业有哪些有趣的故事,与D2中的圣骑士又有着怎样的区分?今天就为大家简单介绍下圣教军的由来与背景故事详解。
凯恩之角每周之星活动重新启动啦!每周之星活动会轮流出现在职业版的一个版块,评比和奖励优秀的经验心得、数据分析等帖子,其中极为优秀的帖子,其作者将被授予每周之星称号,还在等什么,赶紧来参加吧!
当暗黑3中的角色遇上星球大战中的人物会碰撞出什么样的火花呢?今天我们要为大家推荐的是国外玩家sadeceKAAN的绘画作品,他将暗黑3中的武僧与星球大战中的达斯·摩尔融合在了一起,于是就有了精彩的同人作品。
最近,暴雪公开招聘暗黑3项目组的创意总监一职,要求大体为有着6年以上的3A游戏角色设计经验,有鼓舞和启发团队的能力,对暗黑破坏神有着十足的热情等等。你是否觉得有着满腔的创意无处施展,现在你的机会来了!
目前死灵法师的第三轮测试尚在火热进行,有幸抽到测试资格的玩家们都已全方位地体验过新职业死灵法师。那下面就给没有测试资格的玩家们解解馋,一起来欣赏一下死灵法师主动技能动画和各个符文的特效吧!
在19日凌晨的《命运2》发布会上,官方宣布该游戏将加入暴雪游戏平台。这是首款非暴雪出品的游戏加入战网平台,该款游戏将可以直接使用战网点数购买,玩家间可以继承原有的战网好友关系,看到游戏在线状态。
你觉得哪个输出组合可以登顶四人榜?
网易公司版权所有分享给朋友:通用代码: 复 制flash地址: 复 制html代码: 复 制分享视频到站外获取收益&&手机扫码分享视频二维码2小时内有效3.3下载至电脑扫码用手机看用或微信扫码在手机上继续观看二维码2小时内有效3.3扫码用手机继续看用或微信扫码在手机上继续观看二维码2小时内有效,扫码后可分享给好友没有优酷APP?立即下载请根据您的设备选择下载版本
药品服务许可证(京)-经营- 节目制作经营许可证京字670号 请使用者仔细阅读优酷、、Copyright(C)2017 优酷
版权所有不良信息举报***: