设为首页 收藏本站
查看: 1032|回复: 0

[经验分享] python,也不错嘛

[复制链接]

尚未签到

发表于 2017-4-25 08:18:55 | 显示全部楼层 |阅读模式
五一放假,难得有点空闲的时间,虽然工作中也有不少空闲时间,但是很难全心投入干些其它的事,现在终于有点空了。最近由于想做一个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开始。
二、从后往前遍历,见下图:
DSC0000.jpg
即,最后一个元素的下标为-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的方式有很多种,见下图:
DSC0001.bmp
上面列出总共定义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在这方面做得就不错,如果是针对集合类,有几种很好的处理方式,怕翻译得不准确,贴图:
DSC0002.jpg
稍微解释一下,复制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也是不错的啊。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-368831-1-1.html 上篇帖子: 【Python性能优化】禁用gc来加速Python运行 下篇帖子: python入门语法总结
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表