中企动力 > 头条 > python简单项目实例

网站性能检测评分

注:本网站页面html检测工具扫描网站中存在的基本问题,仅供参考。

python简单项目实例

带你走进python自定义模块的实例中,一起来看看 流量视频课程

img

铭记

关注

顾名思义,python中的自定义模块,就不是python自带的模块,而是通过自己来创建出来的。

自己创建的模块,估计自己也感觉到非常有趣了,因为自己能创,也能调用其它人创建的模块使用,在工作量上面是轻松多了,这边所谓的自建模块的后缀名是(.py),还是通过示例来解说一下。特别注意一下,自己创建的模块得放到同一文件夹里面,虽然python有指令可以跨文件夹调用,但结果是不理想的。因为调用一下,下次估计这个指令就失效了,别怪我没提醒大家。下面我创建了两个.py的文件。

zhichuan1.py

zhichuan2.py

我第二个文件可以调用我自己创建的第一个模块的内容。见示例图:

zhichuan1.pyzhichuan2.py

通过上面两张图片可以看出,我第二个模块可以导入第一个模块。省略了写现在时间的程序了,只用了导入语句import zhichuan1和zhichuan1.now_time()。这种自建的模块,在写程序时,只要程序员能够合理利用自己建的模块。再复杂的程序,也不再是难写的事了。请看这个程序运行的结果,见下图:

运行结果

为了让有兴趣的朋友也可以试一下,我把程序代码分享如下:

zhichuan1.py内的程序如下:import time

def now_time():nt = time.localtime() s = ("%02d:%02d:%02d" % nt[3:6]) print(s) time.sleep(1)

zhichuan2.py内的程序如下:

import zhichuan1import time#两位朋友的问时间对话a=str(input("请输入第一位朋友的英文名字tila:"))b=str(input("请输入第二位朋友的英文名字lisa:"))if a=="tila":print("tila:lisa 我们坐了这么久的车,现在是几点了") time.sleep(5)else: print("你输错第一个朋友名字了")if b=="lisa": print("lisa:tila 等等,我看一下,现在是北京时间")else: print("你输错第二个朋友名字了")zhichuan1.now_time()time.sleep(10)

以上是一些简单的程序,主要讲明自建模块的优点。运行时,是运行第二个自建模块。赶快行动起来,程序高手都是练出来的,如果你有自己新创的模块也可以分享出来给我们。因为互相学习才能成长更快,才能让我们的技术有新的突破。

零基础学习Python开发练习实例(3) 流量视频课程

img

刀剑客

关注

21、题目:猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少。

程序分析:采取逆向思维的方法,从后往前推断。

程序源代码:

实例(Python2.0+)

#!/usr/bin/python # -*-coding: UTF-8 -*- x2 = 1 for day in range(9,0,-1): x1 = (x2 + 1) * 2 x2 = x1 print x1

以上实例输出结果为:

1534

22、题目:两个乒乓球队进行比赛,各出三人。甲队为a,b,c三人,乙队为x,y,z三人。已抽签决定比赛名单。有人向队员打听比赛的名单。a说他不和x比,c说他不和x,z比,请编程序找出三队赛手的名单。

程序源代码:

实例(Python 2.0+)

#!/usr/bin/python # -*- coding: UTF-8 -*- for i in range(ord('x'),ord('z') + 1): for j in range(ord('x'),ord('z') + 1): if i != j: for k in range(ord('x'),ord('z') + 1): if (i != k) and (j != k): if (i != ord('x')) and (k != ord('x')) and (k != ord('z')): print 'order is a -- %s b -- %s c--%s' % (chr(i),chr(j),chr(k))

以上实例输出结果为:

order is a -- z b -- x c--y

23、题目:打印出如下图案(菱形):

*

***

*****

*******

*****

***

*

程序分析:先把图形分成两部分来看待,前四行一个规律,后三行一个规律,利用双重for循环,第一层控制行,第二层控制列。

程序源代码:

实例

#!/usr/bin/python # -*- coding: UTF-8 -*- from sys import stdout for i in range(4): for j in range(2 - i + 1): stdout.write(' ') for k in range(2 * i + 1): stdout.write('*') print for i in range(3): for j in range(i + 1): stdout.write(' ') for k in range(4 - 2 * i + 1): stdout.write('*') print

以上实例输出结果为:

*

***

*****

*******

*****

***

*

24、题目:有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13...求出这个数列的前20项之和。

程序分析:请抓住分子与分母的变化规律。

程序源代码:

方法一:

实例

#!/usr/bin/python # -*- coding: UTF-8 -*- a = 2.0 b = 1.0 s = 0 for n in range(1,21): s += a / b t = a a = a + b b = t print s

方法二:

实例

#!/usr/bin/python # -*- coding: UTF-8 -*- a = 2.0 b = 1.0 s = 0.0 for n in range(1,21): s += a / b b,a = a , a + b print s s = 0.0 for n in range(1,21): s += a / b b,a = a , a + b print s

方法三:

实例

#!/usr/bin/python # -*- coding: UTF-8 -*- a = 2.0 b = 1.0 l = l.append(a / b) for n in range(1,20): b,a = a,a + b l.append(a / b) print reduce(lambda x,y: x + y,l)

以上实例输出结果为:

32.6602607986

25、题目:求1+2!+3!+...+20!的和。

程序分析:此程序只是把累加变成了累乘。

方法一

#!/usr/bin/python # -*- coding: UTF-8 -*- n = 0 s = 0 t = 1 for n in range(1,21): t *= n s += t print '1! + 2! + 3! + ... + 20! = %d' % s方法二

#!/usr/bin/python # -*- coding: UTF-8 -*- s = 0 l = range(1,21) def op(x): r = 1 for i in range(1,x + 1): r *= i return r s = sum(map(op,l)) print '1! + 2! + 3! + ... + 20! = %d' % s

以上实例输出结果为:

1! + 2! + 3! + ... + 20! = 2561327494111820313

26、题目:利用递归方法求5!。

程序分析:递归公式:fn=fn_1*4!

程序源代码:

实例

#!/usr/bin/python # -*- coding: UTF-8 -*- def fact(j): sum = 0 if j == 0: sum = 1 else: sum = j * fact(j - 1) return sum print fact(5)

以上实例输出结果为:

120

27、题目:利用递归函数调用方式,将所输入的5个字符,以相反顺序打印出来。

程序分析:无。

程序源代码:

实例(Python 2.0+)

#!/usr/bin/python # -*- coding: UTF-8 -*- def output(s,l): if l==0: return print (s[l-1]) output(s,l-1) s = raw_input('Input a string:') l = len(s) output(s,l)

以上实例输出结果为:

Input a string:abcde

e

d

c

b

a

28、题目:有5个人坐在一起,问第五个人多少岁?他说比第4个人大2岁。问第4个人岁数,他说比第3个人大2岁。问第三个人,又说比第2人大两岁。问第2个人,说比第一个人大两岁。最后问第一个人,他说是10岁。请问第五个人多大?

程序分析:利用递归的方法,递归分为回推和递推两个阶段。要想知道第五个人岁数,需知道第四人的岁数,依次类推,推到第一人(10岁),再往回推。

程序源代码:

实例

#!/usr/bin/python # -*- coding: UTF-8 -*- def age(n): if n == 1: c = 10 else: c = age(n - 1) + 2 return c print age(5)

以上实例输出结果为:

18

29、题目:给一个不多于5位的正整数,要求:一、求它是几位数,二、逆序打印出各位数字。

程序分析:学会分解出每一位数。

程序源代码:

实例

#!/usr/bin/python # -*- coding: UTF-8 -*- x = int(raw_input("请输入一个数: ")) a = x / 10000 b = x % 10000 / 1000 c = x % 1000 / 100 d = x % 100 / 10 e = x % 10 if a != 0: print "5位数:",e,d,c,b,a elif b != 0: print "4位数:",e,d,c,b, elif c != 0: print "3位数:",e,d,c elif d != 0: print "2位数:",e,d else: print "1位数:",e

以上实例输出结果为:

请输入一个数:

23459

5位数: 9 5 4 3 2

请输入一个数:

3472

4位数: 2 7 4 3

30、题目:一个5位数,判断它是不是回文数。即12321是回文数,个位与万位相同,十位与千位相同。

程序分析:无。

程序源代码:

实例(Python 2.0+)

#!/usr/bin/python# -*-coding: UTF-8 -*- a = int(raw_input("请输入一个数字: ")) x = str(a) flag = True for i in range(len(x)/2): if x[i] != x[-i - 1]: flag = False break if flag: print "%d是一个回文数!" % a else: print "%d不是一个回文数!" % a

以上实例输出结果为:

请输入一个数字:

12321

12321是一个回文数!

Python入门之走向编程第一步一个例子开始 行业视频课程

img

郦紫

关注

Of course, we can use Python for more complicated tasks than adding two and two together. For instance, we can write an initial sub-sequence of the Fibonacci series as follows当然,我们可以使用Python来完成比把两个和两个加在一起更复杂的任务。例如,我们可以写出斐波那契级数的初始子序列如下

>>> # Fibonacci series:

... # the sum of two elements defines the next

... a, b = 0, 1

>>> while b < 10:

... print(b)

... a, b = b, a+b

...

1

1

2

3

5

8

The first line contains a multiple assignment: the variables a and b simultaneously get the new values 0 and 1. On the last line this is used again, demonstrating that the expressions on the right-hand side are all evaluated first before any of the assignments take place. The right-hand side expressions are evaluated from the left to the righ

第一行包含多个赋值:变量A和B同时获得新值0和1。在最后一行中,再次使用,表明在任何赋值发生之前首先对右边的表达式进行求值。右边表达式由左到右进行计算。

The while loop executes as long as the condition (here: b < 10) remains true. In Python, like in C, any non-zero integer value is true; zero is false. The condition may also be a string or list value, in fact any sequence; anything with a non-zero length is true, empty sequences are false. The test used in the example is a simple comparison. The standard comparison operators are written the same as in C: < (less than), > (greater than), == (equal to), <= (less than or equal to), >= (greater than or equal to) and != (not equal to).只要条件(这里:b<10)成立,while循环就执行。在Python中,像在C中一样,任何非零整数值都是true;0是false。条件也可以是字符串或列表值,实际上是任何序列;具有非零长度的任何东西都是真的,空序列是错误的。在示例中使用的测试是一个简单的比较。标准比较运算符的编写与C:<(小于)、>(大于)、=(等于)、<=(小于或等于)、>=(大于或等于)和!=(不等于)。

The body of the loop is indented: indentation is Python’s way of grouping statements. At the interactive prompt, you have to type a tab or space(s) for each indented line. In practice you will prepare more complicated input for Python with a text editor; all decent text editors have an auto-indent facility. When a compound statement is entered interactively, it must be followed by a blank line to indicate completion (since the parser cannot guess when you have typed the last line). Note that each line within a basic block must be indented by the same amount.循环体是缩进的:缩进是Python对语句进行分组的方式。在交互式提示符上,您必须为每个缩进线键入一个制表符或空格。在实践中,您将为Python编写一个更复杂的文本编辑器,所有的文本编辑器都有一个自动缩进工具。当一个复合语句交互输入时,必须跟随一条空白行来表示完成(因为解析器不能猜出您输入了最后一行)。请注意,基本块中的每一行必须以相同的数量缩进。

The print() function writes the value of the argument(s) it is given. It differs from just writing the expression you want to write (as we did earlier in the calculator examples) in the way it handles multiple arguments, floating point quantities, and strings. Strings are printed without quotes, and a space is inserted between items, so you can format things nicely, like this:Print()函数写入给定的参数的值。它不同于只写表达式(正如我们前面在计算器示例中所写的),它处理多个参数、浮点量和字符串的方式不同。字符串不带引号打印,在项目之间插入一个空格,这样就可以很好地格式化,像这样:

>>> i = 256*256

>>> print('The value of i is', i)

The value of i is 65536

The keyword argument end can be used to avoid the newline after the output, or end the output with a different string:关键字参数结束可以用来避免输出后的换行符,或者用不同的字符串结束输出:

>>> a, b = 0, 1

>>> while b < 1000:

... print(b, end=',')

... a, b = b, a+b

...

1,1,2,3,5,8,13,21,34,55,89,144,233,377,610,987,

Footnotes:注意:

Since ** has higher precedence than -, -3**2 will be interpreted as -(3**2) and thus result in -9. To avoid this and get 9, you can use (-3)**2.

由于**比-A具有更高的优先级,-*** 2将被解释为-(3**2),从而导致-9。为了避免这个问题,得到9,你可以使用(-3)** 2。

Unlike other languages, special characters such as \n have the same meaning with both single ('...') and double ("...") quotes. The only difference between the two is that within single quotes you don’t need to escape " (but you have to escape \') and vice versa.不像其他语言,特殊字符如\与双单引号(‘...’)和双引号(“....”)有相同的作用,唯一的不同是在双单引号时您不需要避免双引号,但是要避免\',反之亦然。

零基础学习Python开发练习实例(4) 营销视频课程

img

雷丹萱

关注

31、题目:请输入星期几的第一个字母来判断一下是星期几,如果第一个字母一样,则继续判断第二个字母。

程序分析:用情况语句比较好,如果第一个字母一样,则判断用情况语句或if语句判断第二个字母。。

程序源代码:

实例

#!/usr/bin/python

#-*-coding:UTF-8-*-

letter=raw_input("pleaseinput:")

#whileletter!='Y':

ifletter=='S':

print('pleaseinputsecondletter:')

letter=raw_input("pleaseinput:")

ifletter=='a':

print('Saturday')

elifletter=='u':

print('Sunday')

32、题目:按相反的顺序输出列表的值。

程序分析:无。

程序源代码:

实例

#!/usr/bin/python

#-*-coding:UTF-8-*-

a=['one','two','three']

foriina[::-1]:

printi

以上实例输出结果为:

three

two

one

else:

print('dataerror')

elifletter=='F':

print('Friday')

elifletter=='M':

print('Monday')

elifletter=='T':

print('pleaseinputsecondletter')

letter=raw_input("pleaseinput:")

ifletter=='u':

print('Tuesday')

elifletter=='h':

print('Thursday')

else:

print('dataerror')

elifletter=='W':

print('Wednesday')

else:

print('dataerror')

以上实例输出结果为:

pleaseinput:S

pleaseinputsecondletter:

pleaseinput:a

Saturday

33、题目:按逗号分隔列表。

程序分析:无。

实例(Python 2.0+)

#!/usr/bin/python # -*- coding: UTF-8 -*- L = [1,2,3,4,5] s1 = ','.join(str(n) for n in L) print s1

以上实例输出结果为:

1,2,3,4,5

34、题目:练习函数调用。

程序分析:无。

实例

#!/usr/bin/python # -*- coding: UTF-8 -*- def hello_world: print 'hello world' def three_hellos: for i in range(3): hello_world if __name__ == '__main__': three_hellos

以上实例输出结果为:

hello world

hello world

hello world

35、题目:文本颜色设置。

程序分析:无。

实例

#!/usr/bin/python # -*- coding: UTF-8 -*- class bcolors: HEADER = '[95m' OKBLUE = '[94m' OKGREEN = '[92m' WARNING = '[93m' FAIL = '[91m' ENDC = '[0m' BOLD = '[1m' UNDERLINE = '[4m' print bcolors.WARNING + "警告的颜色字体?" + bcolors.ENDC

以上实例输出结果为:

警告的颜色字体? #浅黄色

36、题目:求100之内的素数。

程序分析:无。

程序源代码:

实例(Python 2.0+)

#!/usr/bin/python # -*- coding: UTF-8 -*- #输出指定范围内的素数 #用户输入数据 lower = int(input("输入区间最小值: ")) upper = int(input("输入区间最大值: ")) for num in range(lower,upper + 1): #素数大于 1 if num > 1: for i in range(2,num): if (num % i) == 0: break else: print(num)

以上实例输出结果为:

输入区间最小值: 1

输入区间最大值: 100

2

3

5

7

11

13

17

19

23

29

31

37

41

43

47

53

59

61

67

71

73

79

83

89

97

37、题目:对10个数进行排序。

程序分析:可以利用选择法,即从后9个比较过程中,选择一个最小的与第一个元素交换,下次类推,即用第二个元素与后8个进行比较,并进行交换。

程序源代码:

实例(Python 2.0+)

#!/usr/bin/python # -*- coding: UTF-8 -*- if __name__ == "__main__": N = 10 # input data print '请输入10个数字: ' l = for i in range(N): l.append(int(raw_input('输入一个数字: '))) print for i in range(N): print l[i] print #排列10个数字 for i in range(N - 1): min = i for j in range(i + 1,N): if l[min] > l[j]:min = j l[i],l[min] = l[min],l[i] print '排列之后:' for i in range(N): print l[i]

以上实例输出结果为:

请输入10个数字:

输入一个数字:

5

输入一个数字:

3

输入一个数字:

23

输入一个数字:

67

输入一个数字:

2

输入一个数字:

56

输入一个数字:

45

输入一个数字:

98

输入一个数字:

239

输入一个数字:

9

5

3

23

67

2

56

45

98

239

9

排列之后:

2

3

5

9

23

45

56

67

98

239

38、题目:求一个3*3矩阵主对角线元素之和。

程序分析:利用双重for循环控制输入二维数组,再将a[i][i]累加后输出。

程序源代码:

实例

#!/usr/bin/python # -*- coding: UTF-8 -*- if __name__ == '__main__': a = sum = 0.0 for i in range(3): a.append() for j in range(3): a[i].append(float(raw_input("input num: "))) for i in range(3): sum += a[i][i] print sum

以上实例输出结果为:

input num:

78

input num:

34

input num:

23

input num:

34

input num:

56

input num:

33

input num:

12

input num:

21

input num:

2

136.0

39、题目:有一个已经排好序的数组。现输入一个数,要求按原来的规律将它插入数组中。

程序分析:首先判断此数是否大于最后一个数,然后再考虑插入中间的数的情况,插入后此元素之后的数,依次后移一个位置。

程序源代码:

实例(Python 2.0+)

#!/usr/bin/python # -*- coding: UTF-8 -*- if __name__ == '__main__': #方法一 : 0作为加入数字的占位符 a = [1,4,6,9,13,16,19,28,40,100,0] print '原始列表:' for i in range(len(a)): print a[i], number = int(raw_input("插入一个数字: ")) end = a[9] if number > end: a[10] = number else: for i in range(10): if a[i] > number:temp1= a[i] a[i] = number for j in range(i + 1,11): temp2 = a[j] a[j] = temp1temp1= temp2 break print '排序后列表:' for i in range(11): print a[i],

以上实例输出结果为:

原始列表:

1 4 6 9 13 16 19 28 40 100 0

插入一个数字:

7

排序后列表:

1 4 6 7 9 13 16 19 28 40 100

40、题目:将一个数组逆序输出。

程序分析:用第一个与最后一个交换。

程序源代码:

实例(Python 2.0+)

#!/usr/bin/python# -*-coding: UTF-8 -*- if __name__ == '__main__': a = [9,6,5,4,1] N = len(a) print a for i in range(len(a) / 2): a[i],a[N - i - 1] = a[N - i - 1],a[i] print a

以上实例输出结果为:

[9, 6, 5, 4, 1]

[1, 4, 5, 6, 9]

Python不能用于大型项目?关于Python的10大误解 推广视频课程

img

心奴

关注

语言多元化是PayPal编程文化中一个重要的组成部分。在C++和Java长期流行的同时,更多的团队选择了Jva和Scala。同时,Braintree的收购也引入了一个久经世故的Ruby社区。Python作为一门特别的语言,在eBay和PayPal有很长的历史。而且其流行程度依然有增不减。

eBay的开发者支持Python这个应用于基层领域多年的语言。甚至在eBay管理层官方支持Python以前,技术人员就开始使用Python。我在几年前加入PayPal并选择Python来写内部应用,然而,我却发现了PayPal中将近15年以前的Python代码。

目前,Python 支撑着 超过50个项目, 包括:

功能和产品型, 例如 eBay Now 和 RedLaser运营和基础设施型**, 从开放的 OpenStack 到专有设施中间层服务和应用型**, 例如 PayPal 用来设定价格以及检测用户可用功能的那个(服务/应用)监测代理和接口*型*, 用于涉及到部署和安全的一些用例批处理任务*型*, 例如数据导入,价格调整,及其它项目以及不计其数的开发者工具

在接下来的文章里我将详细介绍那些使得 eBay 和 PayPal 的 Python 生态系统从2011年的不超过25个工程师到2014年超过260个工程师所使用的技术和举措。对于本文,我则会专注于10个不得不予以揭露的关于 eBay 和 PayPal 的企业环境的谬误。

谬误 #1: Python 是一门新语言

伴随着所有的初创公司正在使用它以及孩子们最近也在学习它的事实,这个谬误为何仍然存在是可以理解的。实际上 Python 已经 超过23岁了, 它最初发布于1991年, 早于 HTTP 1.0协议 5年且早于 Java 4年. 目前比较有著名的很早就使用 Python 的例子是在1996年: Google 的第一个成功的网络爬虫。

如果你对于长长的 Python 历史比较好奇,Python 的作者 Guido van Rossum 已经为你准备好整个故事。

谬误 #2: Python 没有被编译

不像 C++ 一样需要一个独立的编译器工具链,Python 实际上被编译成了字节码,和 Java 或者许多其他的编译型语言十分相似。更进一步的编译过程,如果有的话, 取决于运行时环境, 不管是 CPython,PyPy,Jython/JVM,IronPython/CLR,或是其它的进程式虚拟机(process virtual machine)。参考 谬误 #6 来了解更多。

一条在 PayPal 以及其它地方的通用原则就是,(应用的)安全性不能依赖于代码的已编译状态。更为重要的是加强运行时环境的安全,因为实质上每种语言都有一个解码器,或者能被拦截并导出受保护的状态。参考下一条谬误来了解更多的 Python 安全性问题。

谬误 #3: Python 不安全

轻量级 Python 的亲和力可能使他看起来不怎么可怕,但是这里直觉很大程度上是受到了误导的. 安全的一个核心原则就是尽可能让呈现的目标更小. 大系统是违背安全原则的,因为他们趋向于 使行为过渡集中化, 并且也 让开发者难于理解. Python 通过倡导简洁化来边缘化这些恶心的问题. 更有甚者, CPython 通过让自己成为一个简单、稳定并且易于审核的虚拟机来使这些问题得到解决. 事实上,近期 Coverity Software 的一个分析结果显示 CPython 得到了他们的最高质量评级。

Python 还拥有一系列可扩展的开源、产业标准化的安全库序列. 在PayPal, 我们把安全和授信看做是重中之重, 我们发现 hashlib, PyCrypto, 以及 OpenSSL, 通过 PyOpenSSL 和我们自己的定制构建的结合,涵盖了 PayPal 多样化的安全和性能需求。

这些诸多的原因,使得 Python 成为PayPal(和eBay)的应用程序安全团队在某些业务中最快的选择. 这里有把Python用在PayPal的安全第一环境中的几个以安全为基础应用程序:

创建安全代理,以促进密钥的轮换以并巩固加密实现同业界领先的 HSM 技术集成为缺乏兼容性的技术栈构建受TLS保护的封装代理为我们内部的互相认证计划生成键和证书开发主动的漏洞扫描器

另外,还有无数存在安全隐患的用Python构建,面向操作的系统, 诸如防火墙和连接管理. 未来,我们一定回去深入的整合PayPal Python的安全事项.

谬误 #4: Python 是一门脚本语言

Python 确实可以用来编写脚本,并且因其简单的语法、跨平台并且无所不在于 Linux, Macs, 和其它Unix 机器而成为这个领域的领跑者之一。

事实上, Python 可能是常规用途编程语言中最灵活的技术. 以下是一些实例:

电信基础设施 (Twilio)支付系统 (PayPal, Balanced Payments)神经科学和心理学 (许多, 许多, 例子)数值分析和工程 (numpy, numba, 以及 更多其它)动画(LucasArts, Disney, Dreamworks)游戏后台 (Eve Online, Second Life, Battlefield, 以及 其它很多)Email 基础设施 (Mailman, Mailgun)媒体存储和处理 (YouTube, Instagram, Dropbox)操作和系统管理 (Rackspace, OpenStack)自然语言处理(NLTK)机器学习和计算机版本 (scikit-learn, Orange, SimpleCV)安全性和渗透性测试 (很多很多 以及 eBay/PayPal大数据 (Disco, Hadoop support)如理 (Calendar Server, 它 驱动了 Apple iCal)搜索系统 (ITA, Ultraseek, 还有 Google)Internet 基础设施 (DNS) (BIND 10)

更别提网站和web服务了,那些都不在少数. 事实上,PayPal工程师看起来像是有兴趣致力于基于Python的web特性,比如 YouTube 和 Yelp. 如果对Python成功案例的更大清单感兴趣,那就看看官方的清单吧.

谬误 #5: Python 是弱类型的

Python 类型系统的特点是拥有强大、灵活的类型操作. 维基百科上对此作出的阐述.

而存在一个不争而有趣的事实是, Python 是比Java更加强类型的. Java 对于原生类型和对象区分了类型系统,它让null存在于一个灰色地带. 另一方面,现代的 Python 拥有一个统一的强类型系统, 其中什么都没有 的类型是明确指定的. 更进一步的,JVM自身也是动态类型的,因为可以把它的 根源 追溯到由Sun所收购的Smalltalk VM的一个实现。

Python的类型系统 很棒,但要提供给企业级使用,目前仍然还有许多更重大的事项需要关注。

谬误 #6: Python 速度慢

首先是有一个重要区别: Python 是一门编程语言,而不是运行时环境. Python 拥有几个实现:

CPython是参考实现, 且也是广泛发布和使用的实现.Jython是Python用于JVM的是一个成熟的实现.IronPython是 Microsoft 针对其自家的通用语言运行时——又名 .NET,实现的Python .PyPy是一个正在日趋成熟的Python实现,拥有JIT编译,增量垃圾收集诸多先进的特性.每一个运行时都有其自己的性能特点, 而且他们本身也不慢. 这里更重要的地方在于不能错误地把一个性能指标分派到一门编程语言智商. 应该总是把该评估用在一个应用程序运行时上面,最好是针对一个特定的使用场景。

清楚了那些事项之后,下面就是一些有Python提供的小项,体现其重要的性能优势:

把 NumPy 用作 Intel 的 MKL SIMD接口PyPy的 JIT 编译能 达到比C还快的性能Disqus 能在同样的100个盒子上容纳两亿五千万到5亿用户

诚然,这些都不是最新的列子,只是我个人的最爱罢了. 这将很容易扯到高性能Python以及独立提供的运行时这些广阔的领域. 我们不应只是专注于解决单个特殊的案例, 而是应该把注意力放在对开发人员在 最终产品性能 方面的生产力的普遍影响上面, 特别是在一种企业级环境之下。

C++ vs Python,. 两种语言在同一个输出下的对比.

给定足够的时间,一个循规蹈矩的开发者只会按照下面这种经过论证的方式来编写精确高效的软件:

设计实现一个可以正确完成任务的软件,包括开发单独的测试测试性能,明确瓶颈优化,根据测试和Amdahl法则,并且利用Python与C的渊源

虽然这听起来很简单,但是即使是老道的工程师,这依旧是一个非常耗时的过程。Python设计之初就考虑到了这一套开发流程。根据我们的经验,通常C++和Java项目完成一次迭代流程的时间,够Python项目完成三次迭代流程。今天,PayPal和eBay中不乏有Python项目使用更少的代码战胜了同类C++和Java项目,这多亏了快速的开发使得仔

细的裁剪和优化变得可能。

Myth #7: Python无法做到大规模

大规模有许多定义,但无论怎样,YouTube是个大规模网站。每月UV超过十亿,每分钟上传的视频时长超过100小时,占用互联网带宽的20%,所有这一切都以Python作为核心技术。Dropbox,Disqus, Eventbrite, Reddit, Twilio, Instagram, Yelp, EVE Online, Second Life,,以及,是的,以及eBay和PayPal中都有Python大规模的例子,这些证明大规模不仅仅是可能:它是一种模式。

成功的关是键简单性且一致性。CPython,Python的主要虚拟机,其最大限度地放大了这些特性,从而演变出了一个精确可测的运行时。人们很难发现 Python程序员关心垃圾的收集暂停或应用地启动时间。拥有强大的平台和网络支持,Python其本身自然而然的智能水平可扩展,BitTorrent就是其充分的体现。

此外,规模化主要涵盖测量和迭代。Python是以分析和优化为要义建立的。看Myth #6了解更多Python如何垂直拓展的细节。

Myth #8: Python缺少好的并发支持

除了偶尔叫嚣性能和规模化的问题,有人想提的技术些,”Python缺乏并发,”或者,”GIL怎么样?”如果几十个反例仍不足以支持Python水平及垂直拓展规模的能力,那么再更深地解释CPython实现细节也不会有帮助,所以我会简短些。

Python拥有强大的并发原语,包括generators, greenlets, Deferreds, 和futures.。Python有优秀的并发框架,包括eventlet, gevent,和Twisted。Python在定制运行时尚投入了惊人的工作量,包括Stackless和 PyPy。所有烦人这些和更多表明,根本不存工程师们在Python并发编程方面的缺憾。同时,所有这些都正在被正式的在企业生产环境中支持或使用。例如,请参考Myth #7。

全局解释器锁,或称GIL,是Python在大多数应用场景下的性能优化,也是几乎所有CPython实现代码的开发上的基础优化。GIL使得Python可以很便利地使用操作系统的线程或轻线程(通常指greenlets),且不影响使用多进程。更多相关信息,请看该主题的Q&A列表,以及Python文档中的介绍。

在PayPal中,一个典型服务的部署需要多台机器,多个进程,多个线程,以及一个数字非常庞大的greenlets,相当于一个非常强大可扩展的并行环境(见下图)。在大多数的企业环境中,团队更倾向于往更高层次过度,谨慎并注重灾难恢复。然而,在某些情况下,每台机器每天Python服务仍然处理数以百万计的请求,而且轻松处理。

一个基于单一worker的协同异步架构草图。最外层的盒子是进程,下一个层次为线程,这里这些线程都是轻线程。操作系统处理线程间的抢占,而I/O异步协同合作。

谬误 #9: Python 程序员很稀缺

事实上,现在使用 Python 的 web 开发者的确没有使用 PHP 或者 Java 的 web 开发者多。这可能主要是由于企业需求和教育之间的相互作用导致的,不过 教育领域(教学所使用的编程语言)的趋势使得情况可能产生变化 。

也就是说,使用 Python 的开发者并不稀缺。现在全世界有数百万使用 Python 的开发者。已有几十个Python 技术大会、 StackOverflow 上成千上万的 Python 内容问答、雇佣大量使用 Python 的开发者的大企业比如 YouTube 、 美国银行( Bank of American )和 LucasArts/Dreamworks 等等,这些都显而易见地证实了这一点。在 eBay 和 PayPal 我们一直保持拥有几百位使用 Python 的正式开发者,这是怎么做到的呢?

那么,当一个项目被创建时为什么它会被首推?对于孩子来,大学生和教授们来说,Python作为第一门程序设计语言是非常易于学习的。在eBay,仅仅需要一个星期,一个新的Python程序员就能展示一个真正的成果,并且他们开始散发光芒常常只要2-3个月,通过Internet的宝藏(互动式教程,书,文档和开源代码库)一切皆有可能。

另外一个重要的考虑因素是,项目使用Python会更简单,它不会像其他项目那样需要那么多的开发者。在谬误6和谬误9中提到的那样,在Python项目中,学习像Instagram那样的高效团队是一个常见的比喻,并且这确实是我们在eBay和PayPal的经验。

Myth #10: Python不适应于大项目

Myth #7 讨论了大规模运行Python的项目,但开发Python大规模项目是什么情况呢?正如在Myth #9中提到的,大多数Python不被人看好。 然而Instagram在其被亿元美金收购当天达到千万的点击量,而整个公司只有十几个人。Dropbox在2011年只有70个工程师,其他团队更少。所以,Python适合大规模团队吗?

美国银行实际上有超过5000的Python开发者,一个单独的项目超过一千万行Python代码。JP摩根也经历了类似的转变。YouTube也有数千的开发者和数百万行的代码。大规模产品和团队每天都在使用Python,因为它具有良好的模块化和封装特性,在特定方面许多的大规模开发建议是一致的。工具,强大的惯例以及代码审查促使了项目规模化管理的现实。

幸运的是,Python发展于上面所提到的好的奠基。我们在检查执行使用pyflakes以及其他工具进行Python代码的静态分析,正如坚持PEP8——Python语言的基础风格指南。

最后,应该指出的是,除了调度加速Myth #6以及#7中所提到的,使用Python的项目通常需要更少的开发者。我们常见的成功案例中,使用Java或C++的项目通常有3-5开发者耗时2-6个月,最终由单一的开发者在2-6周(或小时,因为这些原因)完成...

Python入门之走向编程第一步一个例子开始 互联网视频课程

img

回音岛

关注

Of course, we can use Python for more complicated tasks than adding two and two together. For instance, we can write an initial sub-sequence of the Fibonacci series as follows当然,我们可以使用Python来完成比把两个和两个加在一起更复杂的任务。例如,我们可以写出斐波那契级数的初始子序列如下

>>> # Fibonacci series:

... # the sum of two elements defines the next

... a, b = 0, 1

>>> while b < 10:

... print(b)

... a, b = b, a+b

...

1

1

2

3

5

8

The first line contains a multiple assignment: the variables a and b simultaneously get the new values 0 and 1. On the last line this is used again, demonstrating that the expressions on the right-hand side are all evaluated first before any of the assignments take place. The right-hand side expressions are evaluated from the left to the righ

第一行包含多个赋值:变量A和B同时获得新值0和1。在最后一行中,再次使用,表明在任何赋值发生之前首先对右边的表达式进行求值。右边表达式由左到右进行计算。

The while loop executes as long as the condition (here: b < 10) remains true. In Python, like in C, any non-zero integer value is true; zero is false. The condition may also be a string or list value, in fact any sequence; anything with a non-zero length is true, empty sequences are false. The test used in the example is a simple comparison. The standard comparison operators are written the same as in C: < (less than), > (greater than), == (equal to), <= (less than or equal to), >= (greater than or equal to) and != (not equal to).只要条件(这里:b<10)成立,while循环就执行。在Python中,像在C中一样,任何非零整数值都是true;0是false。条件也可以是字符串或列表值,实际上是任何序列;具有非零长度的任何东西都是真的,空序列是错误的。在示例中使用的测试是一个简单的比较。标准比较运算符的编写与C:<(小于)、>(大于)、=(等于)、<=(小于或等于)、>=(大于或等于)和!=(不等于)。

The body of the loop is indented: indentation is Python’s way of grouping statements. At the interactive prompt, you have to type a tab or space(s) for each indented line. In practice you will prepare more complicated input for Python with a text editor; all decent text editors have an auto-indent facility. When a compound statement is entered interactively, it must be followed by a blank line to indicate completion (since the parser cannot guess when you have typed the last line). Note that each line within a basic block must be indented by the same amount.循环体是缩进的:缩进是Python对语句进行分组的方式。在交互式提示符上,您必须为每个缩进线键入一个制表符或空格。在实践中,您将为Python编写一个更复杂的文本编辑器,所有的文本编辑器都有一个自动缩进工具。当一个复合语句交互输入时,必须跟随一条空白行来表示完成(因为解析器不能猜出您输入了最后一行)。请注意,基本块中的每一行必须以相同的数量缩进。

The print() function writes the value of the argument(s) it is given. It differs from just writing the expression you want to write (as we did earlier in the calculator examples) in the way it handles multiple arguments, floating point quantities, and strings. Strings are printed without quotes, and a space is inserted between items, so you can format things nicely, like this:Print()函数写入给定的参数的值。它不同于只写表达式(正如我们前面在计算器示例中所写的),它处理多个参数、浮点量和字符串的方式不同。字符串不带引号打印,在项目之间插入一个空格,这样就可以很好地格式化,像这样:

>>> i = 256*256

>>> print('The value of i is', i)

The value of i is 65536

The keyword argument end can be used to avoid the newline after the output, or end the output with a different string:关键字参数结束可以用来避免输出后的换行符,或者用不同的字符串结束输出:

>>> a, b = 0, 1

>>> while b < 1000:

... print(b, end=',')

... a, b = b, a+b

...

1,1,2,3,5,8,13,21,34,55,89,144,233,377,610,987,

Footnotes:注意:

Since ** has higher precedence than -, -3**2 will be interpreted as -(3**2) and thus result in -9. To avoid this and get 9, you can use (-3)**2.

由于**比-A具有更高的优先级,-*** 2将被解释为-(3**2),从而导致-9。为了避免这个问题,得到9,你可以使用(-3)** 2。

Unlike other languages, special characters such as \n have the same meaning with both single ('...') and double ("...") quotes. The only difference between the two is that within single quotes you don’t need to escape " (but you have to escape \') and vice versa.不像其他语言,特殊字符如\与双单引号(‘...’)和双引号(“....”)有相同的作用,唯一的不同是在双单引号时您不需要避免双引号,但是要避免\',反之亦然。

img

在线咨询

建站在线咨询

img

微信咨询

扫一扫添加
动力姐姐微信

img
img

TOP