python,也不错嘛

五一放假,难得有点空闲的时间,虽然工作中也有不少空闲时间,但是很难全心投入干些其它的事,现在终于有点空了。最近由于想做一个C/S软件,所以想学习一下其它的语言,因为JAVA在做C/S软件方面没有任何优势,尤其是在此windows平台,但是个人对VB、C#又没什么兴趣,delphi这个东西算是不错,但现在已经发展得不怎么样了,没必要花时间去学一门没什么前途的语言,VC也不错,但是开发效率并不能让人满意,当然本人也不是很熟悉VC,前些时间看了一下ruby,但是在做C/S方面一点都不成熟。虽然很久以前都听过python了,但是一直没有关注,它到底能做啥,仔细了解,python在各个方面都不错,平台、B/S、C/S都很不错,于是今天花了点时间试了一下,的确不错,不像ruby那样,规则有点乱,python的语言结构的确要清晰得多。
python是一门很简单的语言,如果认真一点,基本语法一天就能搞定,算了,搞个例子上来,做个纪念:


import sys

Zero = [" *** ",
" * * ",
"* *",
"* *",
"* *",
" * * ",
" *** "]
One = [" * ", "** ", " * ", " * ", " * ", " * ", "***"]
Two = [" *** ", "* *", "* * ", " * ", " * ", "* ", "*****"]
Three = [" *** ", "* *", " *", " ** ", " *", "* *", " *** "]
Four = [" * ", " ** ", " * * ", "* * ", "******", " * ",
" * "]
Five = ["*****", "* ", "* ", " *** ", " *", "* *", " *** "]
Six = [" *** ", "* ", "* ", "**** ", "* *", "* *", " *** "]
Seven = ["*****", " *", " * ", " * ", " * ", "* ", "* "]
Eight = [" *** ", "* *", "* *", " *** ", "* *", "* *", " *** "]
Nine = [" ****", "* *", "* *", " ****", " *", " *", " *"]

Digits = [Zero, One, Two, Three, Four, Five, Six, Seven, Eight, Nine]

try:
digits = sys.argv[1]
row = 0
while row < 7:
line = ""
column = 0
while column < len(digits):
number = int(digits[column])
digit = Digits[number]
line += digit[row] + " "
column += 1
print(line)
row += 1
except IndexError:
print("usage: bigdigits.py <number>")
except ValueError as err:
print(err, "in", digits)


这个例子也是从书上抄的,上面的内容也很简单,有个IndexError错误相当 于java里面的IndexOutOfException之类的错误,代表数组溢出,ValueError用在上面的地方,就是表示转型错误。还有一些细节也是需要注意的,如代码块缩进,上面的例子中并没有{}、begin/end之类,但是怎么判断某个块的程序结束呢?如while子句到什么地方结束的呢?python里面有一种隐式的规则,那就是相当的代码缩进代表相同的代码块,而且缩进最好用4个空格来区分,而不要用tab来区分。而且python也没有i++这种用法,自加需用i+=1来操作,这与ruby差不多的。python里面也没有toString()之类的方法,而且不能直接使用a = 2+"23"操作,必须转换成相同的类型a=str(2)+"23"才可以。
上面例子的功能就是输出数字的*格式,如bigdigits.py 235,那么将打印输出235的*样式,从这个例子可以看出,其实编程结构与java类似(用java来实现大体也是这个流程),但没有java那么多约束。

随便写点,今天又看了一下,python里面比较对象用的是is或is not,由于对象之间的比较直接比较的内存地址,所以速度非常快,但是在一般不用它比较intS,strS类型,即整型与字符串类型,如果那样“==”应该好一些。空对象用None表示,个人觉得None还是没NULL直接。

python的数组算是个不错的东西,数组其实是有点面向过程的,尤其是在java里面,几乎都可以用collection替代,不过python还算是个不错的东西,主要有三种方式的遍历:
一、从前向后遍历,最基本的一种方式,下标从0开始。
二、从后往前遍历,见下图:

[img]http://dl.iteye.com/upload/attachment/243334/e393fc75-cf9b-3127-841d-6fbec3931d8f.jpg[/img]
即,最后一个元素的下标为-1,依次递减。
三、遍历部分元素,如hair[:2]表示遍历下标为2前面的元素(不包括索引为2的元素),也可以使用hair[2:](包括索引为2的元素),这个与前面相反,遍历2及后面的元素。

数组里面还有个有意思的东西,那就是把数组里面的内容附给多个变量,如:
first, *rest = [9, 2, -4, 8, 7]
那么rest的数据为[2, -4, 8, 7],需要注意的是使用*时,左边的变量要有两个或两个以上。
*还是一个重复的功能,如a="123",b=a*2,那么b="123123"。

dict也是不错的东西,相对java的map,用法要灵活得多,定义map的方式有很多种,见下图:

[img]http://dl.iteye.com/upload/attachment/243385/f3a459c3-7c5e-367c-8d2e-67c5923bc8df.bmp[/img]
上面列出总共定义dict的方法,关于dict的API设计也很好,遍历也很灵活,可以通过d.values、d.keys、d.items分别遍历值、键或者一起遍历。
帖一个关于dict的例子:


import string
import sys

words = {}
strip = string.whitespace + string.punctuation + string.digits + "\"'"
for filename in sys.argv[1:]:
for line in open(filename):
for word in line.lower().split():
word = word.strip(strip)
if len(word) > 2:
words[word] = words.get(word, 0) + 1
for word in sorted(words):
print("'{0}' occurs {1} times".format(word, words[word]))



这个例子的作用是统计某一个或多个文件的单词出现的次数,其实上面这个例子也是不完善的,在分离单词时并不准确,那个strip只是删除字符串前面与后面的空格,相当于执行了lstrip()与rstrip()方法。

搞个java的人就知道,有个prototype(原形设计模式)模式,如果写一个类,需要覆盖clone()这个方法,处理起来很不优雅,不过python在这方面做得就不错,如果是针对集合类,有几种很好的处理方式,怕翻译得不准确,贴图:

[img]http://dl.iteye.com/upload/attachment/244339/b7136a2a-758d-39f2-93bd-7152c5605a54.jpg[/img]
稍微解释一下,复制list可以用list(L)或L[:],复制set与dict可以用L.copy(),还有一个深度的方法,一般对象与集合都可以可以使用:

import copy
a=1
b=copy.copy(a)


x = [53, 68, ["A", "B", "C"]]
y = copy.deepcopy(x)

当a的值改变时,b的值并不会变。

当然python也有set,只是数组用()表示,list用[]表示,set则用{}表示,不过还有个不可修改的frozenset,如a=frozenset({8, 4, 7}),那么a的内部元素是不可变的,当然a还是可以指向其它可变对象的,因为a本身只是一个引用。

下面简单的介绍一下python的控制结构:


if boolean_expression1:
suite1
elif boolean_expression2:
suite2
...
elif boolean_expressionN:
suiteN
else:
else_suite

上面的elif也可以省略。
if还有一种比较有意思的用法:

offset = 20 if boolean_expression else 10


循环也有两种,while与for in:


while boolean_expression:
while_suite
else:
else_suite
......
for expression in iterable:
for_suite
else:
else_suite

如:


s="china"
for i,v in enumerate(s):
print(i,v)

其中i为索引,v为遍历的值。

python的异常机制与java类似:


try:
try_suite
except exception_group1 as variable1:
except_suite1
...
except exception_groupN as variableN:
except_suiteN
else:
else_suite
finally:
finally_suite


方法定义也很简单,与java差不多:


def functionName(parameters):
suite

如:

def heron(a, b, c):
s = (a + b + c) / 2
return math.sqrt(s * (s - a) * (s - b) * (s - c))


上面这些结构理解起来很容易,但是功能依然很强大。

python还有一些特别的东西,比如del语句,此语句表示删除对象的意思,它可以删除某个对象或某个集合内的一个对象,如del a或del a[1]。boolean值也有奇怪,比如True与False的第一个字母都要大写,None也是。

web开发做久了,很少接触到算法之类的东西,就算叫自己做个像上面一样的例子也是不容易的,开发有空做做C/S也是不错的啊。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值