掌握Python 99 个实用实例,其中精选算法高频题目以及答案,助力求职Python工程师面试不慌拿offer。
Python由荷兰国家数学与计算机科学研究中心的吉多·范罗苏姆于1990年代初设计,作为一门叫做ABC语言的替代品。Python提供了高效的高级数据结构,还能简单有效地面向对象编程。Python语法和动态类型,以及解释型语言的本质,使它成为多数平台上写脚本和快速开发应用的编程语言,随着版本的不断更新和语言新功能的添加,逐渐被用于独立的、大型项目的开发。
Python在各个编程语言中比较适合新手学习,Python解释器易于扩展,可以使用C、C++或其他可以通过C调用的语言扩展新的功能和数据类型。 Python也可用于可定制化软件中的扩展程序语言。Python丰富的标准库,提供了适用于各个主要系统平台的源码或机器码。
中文官网地址: https://python.p2hp.com/
题目:有四个数字:1、2、3、4,能组成多少个互不相同且无重复数字的三位数?各是多少?
#!/usr/bin/python
# -*- coding: UTF-8 -*-
for i in range(1,5):
for j in range(1,5):
for k in range(1,5):
if( i != k ) and (i != j) and (j != k):
print (i,j,k)
题目:一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?
#!/usr/bin/python
# -*- coding: UTF-8 -*-
for i in range(1,85):
if 168 % i == 0:
j = 168 / i;
if i > j and (i + j) % 2 == 0 and (i - j) % 2 == 0 :
m = (i + j) / 2
n = (i - j) / 2
x = n * n - 100
print(x)
题目:输入某年某月某日,判断这一天是这一年的第几天?
#!/usr/bin/python3
year = int(input('year:\n'))
month = int(input('month:\n'))
day = int(input('day:\n'))
months = (0,31,59,90,120,151,181,212,243,273,304,334)
if 0 < month <= 12:
sum = months[month - 1]
else:
print ('data error')
sum += day
leap = 0
if (year % 400 == 0) or ((year % 4 == 0) and (year % 100 != 0)):
leap = 1
if (leap == 1) and (month > 2):
sum += 1
print ('it is the %dth day.' % sum)
题目:输入三个整数x,y,z,请把这三个数由小到大输出。
#!/usr/bin/python
# -*- coding: UTF-8 -*-
l = []
for i in range(3):
x = int(raw_input('integer:\n'))
l.append(x)
l.sort()
print l
题目:斐波那契数列。
#!/usr/bin/python
# -*- coding: UTF-8 -*-
def fib(n):
a,b = 1,1
for i in range(n-1):
a,b = b,a+b
return a
# 输出了第10个斐波那契数列
print (fib(10))
题目:将一个列表的数据复制到另一个列表中。
#!/usr/bin/python
# -*- coding: UTF-8 -*-
a = [1, 2, 3]
b = a[:]
print (b)
题目:输出 9*9 乘法口诀表。
#!/usr/bin/python
# -*- coding: UTF-8 -*-
for i in range(1, 10):
print
for j in range(1, i+1):
print "%d*%d=%d" % (i, j, i*j),
题目:暂停一秒输出。
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import time
myD = {1: 'a', 2: 'b'}
for key, value in dict.items(myD):
print (key, value)
time.sleep(1) # 暂停 1 秒
题目:暂停一秒输出,并格式化当前时间。
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import time
print (time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time())))
# 暂停一秒
time.sleep(1)
print (time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time())))
题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?
#!/usr/bin/python
# -*- coding: UTF-8 -*-
f1 = 1
f2 = 1
for i in range(1,22):
print '%12ld %12ld' % (f1,f2),
if (i % 3) == 0:
print ''
f1 = f1 + f2
f2 = f1 + f2
题目:判断101-200之间有多少个素数,并输出所有素数。
#!/usr/bin/python
# -*- coding: UTF-8 -*-
h = 0
leap = 1
from math import sqrt
from sys import stdout
for m in range(101,201):
k = int(sqrt(m + 1))
for i in range(2,k + 1):
if m % i == 0:
leap = 0
break
if leap == 1:
print ('%-4d' % m)
h += 1
if h % 10 == 0:
print ('')
leap = 1
print ('The total is %d' % h)
题目:打印出所有的"水仙花数",所谓"水仙花数"是指一个三位数,其各位数字立方和等于该数本身。例如:153是一个"水仙花数",因为153=1的三次方+5的三次方+3的三次方。
#!/usr/bin/python
# -*- coding: UTF-8 -*-
for n in range(100,1000):
i = n / 100
j = n / 10 % 10
k = n % 10
if n == i ** 3 + j ** 3 + k ** 3:
print n
题目:将一个正整数分解质因数。例如:输入90,打印出90=233*5。
#!/usr/bin/python
# -*- coding: UTF-8 -*-
def reduceNum(n):
print '{} = '.format(n),
if not isinstance(n, int) or n <= 0 :
print '请输入一个正确的数字 !'
exit(0)
elif n in [1] :
print '{}'.format(n)
while n not in [1] : # 循环保证递归
for index in xrange(2, n + 1) :
if n % index == 0:
n /= index # n 等于 n/index
if n == 1:
print index
else : # index 一定是素数
print '{} *'.format(index),
break
reduceNum(90)
reduceNum(100)
题目:利用条件运算符的嵌套来完成此题:学习成绩>=90分的同学用A表示,60-89分之间的用B表示,60分以下的用C表示。
#!/usr/bin/python
# -*- coding: UTF-8 -*-
score = int(raw_input('输入分数:\n'))
if score >= 90:
grade = 'A'
elif score >= 60:
grade = 'B'
else:
grade = 'C'
print '%d 属于 %s' % (score,grade)
题目:输出指定格式的日期。
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import datetime
if __name__ == '__main__':
# 输出今日日期,格式为 dd/mm/yyyy。更多选项可以查看 strftime() 方法
print(datetime.date.today().strftime('%d/%m/%Y'))
# 创建日期对象
miyazakiBirthDate = datetime.date(1941, 1, 5)
print(miyazakiBirthDate.strftime('%d/%m/%Y'))
# 日期算术运算
miyazakiBirthNextDay = miyazakiBirthDate + datetime.timedelta(days=1)
print(miyazakiBirthNextDay.strftime('%d/%m/%Y'))
# 日期替换
miyazakiFirstBirthday = miyazakiBirthDate.replace(year=miyazakiBirthDate.year + 1)
print(miyazakiFirstBirthday.strftime('%d/%m/%Y'))
题目:输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import string
s = raw_input('请输入一个字符串:\n')
letters = 0
space = 0
digit = 0
others = 0
i=0
while i < len(s):
c = s[i]
i += 1
if c.isalpha():
letters += 1
elif c.isspace():
space += 1
elif c.isdigit():
digit += 1
else:
others += 1
print 'char = %d,space = %d,digit = %d,others = %d' % (letters,space,digit,others)
题目:求s=a+aa+aaa+aaaa+aa…a的值,其中a是一个数字。例如2+22+222+2222+22222(此时共有5个数相加),几个数相加由键盘控制。
#!/usr/bin/python
# -*- coding: UTF-8 -*-
Tn = 0
Sn = []
n = int(raw_input('n = '))
a = int(raw_input('a = '))
for count in range(n):
Tn = Tn + a
a = a * 10
Sn.append(Tn)
print Tn
Sn = reduce(lambda x,y : x + y,Sn)
print "计算和为:",Sn
题目:一个数如果恰好等于它的因子之和,这个数就称为"完数"。例如6=1+2+3.编程找出1000以内的所有完数。
#!/usr/bin/python
# -*- coding: UTF-8 -*-
from sys import stdout
for j in range(2,1001):
k = []
n = -1
s = j
for i in range(1,j):
if j % i == 0:
n += 1
s -= i
k.append(i)
if s == 0:
print (j)
for i in range(n):
stdout.write(str(k[i]))
stdout.write(' ')
print (k[n])
题目:一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在第10次落地时,共经过多少米?第10次反弹多高?
#!/usr/bin/python
# -*- coding: UTF-8 -*-
tour = []
height = []
hei = 100.0 # 起始高度
tim = 10 # 次数
for i in range(1, tim + 1):
# 从第二次开始,落地时的距离应该是反弹高度乘以2(弹到最高点再落下)
if i == 1:
tour.append(hei)
else:
tour.append(2*hei)
hei /= 2
height.append(hei)
print('总高度:tour = {0}'.format(sum(tour)))
print('第10次反弹高度:height = {0}'.format(height[-1]))
题目:猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少。
#!/usr/bin/python
# -*- coding: UTF-8 -*-
x2 = 1
for day in range(9,0,-1):
x1 = (x2 + 1) * 2
x2 = x1
print (x1)
题目:两个乒乓球队进行比赛,各出三人。甲队为a,b,c三人,乙队为x,y,z三人。已抽签决定比赛名单。有人向队员打听比赛的名单。a说他不和x比,c说他不和x,z比,请编程序找出三队赛手的名单。
#!/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\t b -- %s\tc--%s' % (chr(i),chr(j),chr(k)))
题目:打印出如下图案(菱形):
#!/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('')
题目:有一分数序列: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)
题目:求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)
题目:利用递归方法求5!。
#!/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))
题目:利用递归函数调用方式,将所输入的5个字符,以相反顺序打印出来。
#!/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)
题目:有5个人坐在一起,问第五个人多少岁?他说比第4个人大2岁。问第4个人岁数,他说比第3个人大2岁。问第三个人,又说比第2人大两岁。问第2个人,说比第一个人大两岁。最后问第一个人,他说是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))
题目:给一个不多于5位的正整数,要求:一、求它是几位数,二、逆序打印出各位数字。
#!/usr/bin/python
# -*- coding: UTF-8 -*-
x = int(raw_input("请输入一个数:\n"))
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
题目:一个5位数,判断它是不是回文数。即12321是回文数,个位与万位相同,十位与千位相同。
#!/usr/bin/python
# -*- coding: UTF-8 -*-
a = int(raw_input("请输入一个数字:\n"))
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
题目:请输入星期几的第一个字母来判断一下是星期几,如果第一个字母一样,则继续判断第二个字母。
#!/usr/bin/python
# -*- coding: UTF-8 -*-
letter = raw_input("please input:")
#while letter != 'Y':
if letter == 'S':
print ('please input second letter:')
letter = raw_input("please input:")
if letter == 'a':
print ('Saturday')
elif letter == 'u':
print ('Sunday')
else:
print ('data error')
elif letter == 'F':
print ('Friday')
elif letter == 'M':
print ('Monday')
elif letter == 'T':
print ('please input second letter')
letter = raw_input("please input:")
if letter == 'u':
print ('Tuesday')
elif letter == 'h':
print ('Thursday')
else:
print ('data error')
elif letter == 'W':
print ('Wednesday')
else:
print ('data error')
题目:按相反的顺序输出列表的值。
#!/usr/bin/python
# -*- coding: UTF-8 -*-
a = ['one', 'two', 'three']
for i in a[::-1]:
print (i)
题目:按逗号分隔列表。
#!/usr/bin/python
# -*- coding: UTF-8 -*-
L = [1,2,3,4,5]
s1 = ','.join(str(n) for n in L)
print (s1)
题目:练习函数调用。
#!/usr/bin/python
# -*- coding: UTF-8 -*-
def hello_runoob():
print ('RUNOOB')
def hello_runoobs():
for i in range(3):
hello_runoob()
if __name__ == '__main__':
hello_runoobs()
题目:文本颜色设置。
#!/usr/bin/python
# -*- coding: UTF-8 -*-
class bcolors:
HEADER = '\033[95m'
OKBLUE = '\033[94m'
OKGREEN = '\033[92m'
WARNING = '\033[93m'
FAIL = '\033[91m'
ENDC = '\033[0m'
BOLD = '\033[1m'
UNDERLINE = '\033[4m'
print (bcolors.WARNING + "警告的颜色字体?" + bcolors.ENDC)
题目:求100之内的素数。
#!/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)
题目:对10个数进行排序。
#!/usr/bin/python
# -*- coding: UTF-8 -*-
if __name__ == "__main__":
N = 10
# input data
print ('请输入10个数字:\n')
l = []
for i in range(N):
l.append(int(input('输入一个数字:\n')))
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])
题目:求一个3*3矩阵主对角线元素之和。
#!/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(input("input num:\n")))
for i in range(3):
sum += a[i][i]
print (sum)
题目:有一个已经排好序的数组。现输入一个数,要求按原来的规律将它插入数组中。
#!/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(input("\n插入一个数字:\n"))
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] = temp1
temp1 = temp2
break
print ('排序后列表:')
for i in range(11):
print (a[i])
题目:将一个数组逆序输出。
#!/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)
题目:统计 1 到 100 之和。
#!/usr/bin/python
# -*- coding: UTF-8 -*-
tmp = 0
for i in range(1,101):
tmp += i
print ('The sum is %d' % tmp)
题目:求输入数字的平方,如果平方运算后小于 50 则退出。
#!/usr/bin/python
# -*- coding: UTF-8 -*-
TRUE = 1
FALSE = 0
def SQ(x):
return x * x
print ('如果输入的数字小于 50,程序将停止运行。')
again = 1
while again:
num = int(input('请输入一个数字:'))
print ('运算结果为: %d' % (SQ(num)))
if SQ(num) >= 50:
again = TRUE
else:
again = FALSE
题目:使用lambda来创建匿名函数。
#!/usr/bin/python
# -*- coding: UTF-8 -*-
MAXIMUM = lambda x,y : (x > y) * x + (x < y) * y
MINIMUM = lambda x,y : (x > y) * y + (x < y) * x
if __name__ == '__main__':
a = 10
b = 20
print ('The largar one is %d' % MAXIMUM(a,b))
print ('The lower one is %d' % MINIMUM(a,b))
题目:输出一个随机数。
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import random
#生成 10 到 20 之间的随机数
print (random.uniform(10, 20))
题目:学习使用按位与 & 。
#!/usr/bin/python
# -*- coding: UTF-8 -*-
if __name__ == '__main__':
a = 0x77
b = a & 3
print ('a & b = %d' % b)
b &= 7
print ('a & b = %d' % b)
题目:学习使用按位或 | 。
#!/usr/bin/python
# -*- coding: UTF-8 -*-
if __name__ == '__main__':
a = 0o77
b = a | 3
print ('a | b is %d' % b)
b |= 7
print ('a | b is %d' % b)
题目:取一个整数a从右端开始的4?7位。
#!/usr/bin/python
# -*- coding: UTF-8 -*-
if __name__ == '__main__':
a = int(input('input a number:\n'))
b = a >> 4
c = ~(~0 << 4)
d = b & c
print ('%o\t%o' %(a,d))
题目:画图,学用circle画圆形。
#!/usr/bin/python
# -*- coding: UTF-8 -*-
if __name__ == '__main__':
from Tkinter import *
canvas = Canvas(width=800, height=600, bg='yellow')
canvas.pack(expand=YES, fill=BOTH)
k = 1
j = 1
for i in range(0,26):
canvas.create_oval(310 - k,250 - k,310 + k,250 + k, width=1)
k += j
j += 0.3
mainloop()
题目:画图,学用line画直线。
#!/usr/bin/python
# -*- coding: UTF-8 -*-
if __name__ == '__main__':
from Tkinter import *
canvas = Canvas(width=300, height=300, bg='green')
canvas.pack(expand=YES, fill=BOTH)
x0 = 263
y0 = 263
y1 = 275
x1 = 275
for i in range(19):
canvas.create_line(x0,y0,x0,y1, width=1, fill='red')
x0 = x0 - 5
y0 = y0 - 5
x1 = x1 + 5
y1 = y1 + 5
x0 = 263
y1 = 275
y0 = 263
for i in range(21):
canvas.create_line(x0,y0,x0,y1,fill = 'red')
x0 += 5
y0 += 5
y1 += 5
mainloop()
题目:画图,学用rectangle画方形。
#!/usr/bin/python
# -*- coding: UTF-8 -*-
if __name__ == '__main__':
from Tkinter import *
root = Tk()
root.title('Canvas')
canvas = Canvas(root,width = 400,height = 400,bg = 'yellow')
x0 = 263
y0 = 263
y1 = 275
x1 = 275
for i in range(19):
canvas.create_rectangle(x0,y0,x1,y1)
x0 -= 5
y0 -= 5
x1 += 5
y1 += 5
canvas.pack()
root.mainloop()
题目:计算字符串长度。
#!/usr/bin/python
# -*- coding: UTF-8 -*-
sStr1 = 'strlen'
print len(sStr1)
题目:打印出杨辉三角形(要求打印出10行如下图)。
#!/usr/bin/python
# -*- coding: UTF-8 -*-
if __name__ == '__main__':
a = []
for i in range(10):
a.append([])
for j in range(10):
a[i].append(0)
for i in range(10):
a[i][0] = 1
a[i][i] = 1
for i in range(2,10):
for j in range(1,i):
a[i][j] = a[i - 1][j-1] + a[i - 1][j]
from sys import stdout
for i in range(10):
for j in range(i + 1):
stdout.write(str(a[i][j]))
stdout.write(' ')
print
题目:画椭圆。
#!/usr/bin/python
# -*- coding: UTF-8 -*-
if __name__ == '__main__':
from Tkinter import *
x = 360
y = 160
top = y - 30
bottom = y - 30
canvas = Canvas(width = 400,height = 600,bg = 'white')
for i in range(20):
canvas.create_oval(250 - top,250 - bottom,250 + top,250 + bottom)
top -= 5
bottom += 5
canvas.pack()
mainloop()
题目:输入3个数a,b,c,按大小顺序输出。
#!/usr/bin/python
# -*- coding: UTF-8 -*-
if __name__ == '__main__':
n1 = int(raw_input('n1 = :\n'))
n2 = int(raw_input('n2 = :\n'))
n3 = int(raw_input('n3 = :\n'))
def swap(p1,p2):
return p2,p1
if n1 > n2 : n1,n2 = swap(n1,n2)
if n1 > n3 : n1,n3 = swap(n1,n3)
if n2 > n3 : n2,n3 = swap(n2,n3)
print n1,n2,n3
题目:输入数组,最大的与第一个元素交换,最小的与最后一个元素交换,输出数组。
#!/usr/bin/python
# -*- coding: UTF-8 -*-
def inp(numbers):
for i in range(6):
numbers.append(int(raw_input('输入一个数字:\n')))
p = 0
def arr_max(array):
max = 0
for i in range(1,len(array) - 1):
p = i
if array[p] > array[max] : max = p
k = max
array[0],array[k] = array[k],array[0]
def arr_min(array):
min = 0
for i in range(1,len(array) - 1):
p = i
if array[p] < array[min] : min = p
l = min
array[5],array[l] = array[l],array[5]
def outp(numbers):
for i in range(len(numbers)):
print numbers[i]
if __name__ == '__main__':
array = []
inp(array) # 输入 6 个数字并放入数组
arr_max(array) # 获取最大元素并与第一个元素交换
arr_min(array) # 获取最小元素并与最后一个元素交换
print '计算结果:'
outp(array)
题目:有 n 个整数,使其前面各数顺序向后移 m 个位置,最后 m 个数变成最前面的 m 个数
#!/usr/bin/python
# -*- coding: UTF-8 -*-
if __name__ == '__main__':
n = int(raw_input('整数 n 为:\n'))
m = int(raw_input('向后移 m 个位置为:\n'))
def move(array,n,m):
array_end = array[n - 1]
for i in range(n - 1,-1,- 1):
array[i] = array[i - 1]
array[0] = array_end
m -= 1
if m > 0:move(array,n,m)
number = []
for i in range(n):
number.append(int(raw_input('输入一个数字:\n')))
print '原始列表:',number
move(number,n,m)
print '移动之后:',number
题目:有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。
#!/usr/bin/python
# -*- coding: UTF-8 -*-
if __name__ == '__main__':
nmax = 50
n = int(raw_input('请输入总人数:'))
num = []
for i in range(n):
num.append(i + 1)
i = 0
k = 0
m = 0
while m < n - 1:
if num[i] != 0 : k += 1
if k == 3:
num[i] = 0
k = 0
m += 1
i += 1
if i == n : i = 0
i = 0
while num[i] == 0: i += 1
print num[i]
题目:编写input()和output()函数输入,输出5个学生的数据记录。
#!/usr/bin/python
# -*- coding: UTF-8 -*-
N = 3
#stu
# num : string
# name : string
# score[4]: list
student = []
for i in range(5):
student.append(['','',[]])
def input_stu(stu):
for i in range(N):
stu[i][0] = raw_input('input student num:\n')
stu[i][1] = raw_input('input student name:\n')
for j in range(3):
stu[i][2].append(int(raw_input('score:\n')))
def output_stu(stu):
for i in range(N):
print '%-6s%-10s' % ( stu[i][0],stu[i][1] )
for j in range(3):
print '%-8d' % stu[i][2][j]
if __name__ == '__main__':
input_stu(student)
print student
output_stu(student)
题目:创建一个链表。
#!/usr/bin/python
# -*- coding: UTF-8 -*-
if __name__ == '__main__':
ptr = []
for i in range(5):
num = int(raw_input('please input a number:\n'))
ptr.append(num)
print ptr
题目:反向输出一个链表。
#!/usr/bin/python
# -*- coding: UTF-8 -*-
if __name__ == '__main__':
ptr = []
for i in range(5):
num = int(raw_input('please input a number:\n'))
ptr.append(num)
print ptr
ptr.reverse()
print ptr
题目:列表排序及连接。
#!/usr/bin/python
# -*- coding: UTF-8 -*-
if __name__ == '__main__':
a = [1,3,2]
b = [3,4,5]
a.sort() # 对列表 a 进行排序
print a
# 连接列表 a 与 b
print a+b
# 连接列表 a 与 b
a.extend(b)
print a
题目:放松一下,算一道简单的题目。
#!/usr/bin/python
# -*- coding: UTF-8 -*-
if __name__ == '__main__':
for i in range(5):
n = 0
if i != 1: n += 1
if i == 3: n += 1
if i == 4: n += 1
if i != 4: n += 1
if n == 3: print 64 + i
题目:编写一个函数,输入n为偶数时,调用函数求1/2+1/4+…+1/n,当输入n为奇数时,调用函数1/1+1/3+…+1/n
#!/usr/bin/python
# -*- coding: UTF-8 -*-
def peven(n):
i = 0
s = 0.0
for i in range(2,n + 1,2):
s += 1.0 / i # Python里,整数除整数,只能得出整数,所以需要使用 浮点数 1.0
return s
def podd(n):
s = 0.0
for i in range(1, n + 1,2):
s += 1.0 / i # Python里,整数除整数,只能得出整数,所以需要使用 浮点数 1.0
return s
def dcall(fp,n):
s = fp(n)
return s
if __name__ == '__main__':
n = int(raw_input('input a number:\n'))
if n % 2 == 0:
sum = dcall(peven,n)
else:
sum = dcall(podd,n)
print sum
题目:循环输出列表
#!/usr/bin/python
# -*- coding: UTF-8 -*-
if __name__ == '__main__':
s = ["man","woman","girl","boy","sister"]
for i in range(len(s)):
print s[i]
题目:找到年龄最大的人,并输出。请找出程序中有什么问题。
#!/usr/bin/python
# -*- coding: UTF-8 -*-
if __name__ == '__main__':
person = {"li":18,"wang":50,"zhang":20,"sun":22}
m = 'li'
for key in person.keys():
if person[m] < person[key]:
m = key
print '%s,%d' % (m,person[m])
题目:字符串排序。
#!/usr/bin/python
# -*- coding: UTF-8 -*-
if __name__ == '__main__':
str1 = raw_input('input string:\n')
str2 = raw_input('input string:\n')
str3 = raw_input('input string:\n')
print str1,str2,str3
if str1 > str2 : str1,str2 = str2,str1
if str1 > str3 : str1,str3 = str3,str1
if str2 > str3 : str2,str3 = str3,str2
print 'after being sorted.'
print str1,str2,str3
题目:海滩上有一堆桃子,五只猴子来分。第一只猴子把这堆桃子平均分为五份,多了一个,这只猴子把多的一个扔入海中,拿走了一份。第二只猴子把剩下的桃子又平均分成五份,又多了一个,它同样把多的一个扔入海中,拿走了一份,第三、第四、第五只猴子都是这样做的,问海滩上原来最少有多少个桃子?
#!/usr/bin/python
# -*- coding: UTF-8 -*-
if __name__ == '__main__':
i = 0
j = 1
x = 0
while (i < 5) :
x = 4 * j
for i in range(0,5) :
if(x%4 != 0) :
break
else :
i += 1
x = (x/4) * 5 +1
j += 1
print x
题目:809*??=800*??+9*?? 其中??代表的两位数, 809*??为四位数,8*??的结果为两位数,9*??的结果为3位数。求??代表的两位数,及809*??后的结果。
#!/usr/bin/python
# -*- coding: UTF-8 -*-
a = 809
for i in range(10,100):
b = i * a
if b >= 1000 and b <= 10000 and 8 * i < 100 and 9 * i >= 100:
print b,' = 800 * ', i, ' + 9 * ', i
题目:八进制转换为十进制
#!/usr/bin/python
# -*- coding: UTF-8 -*-
if __name__ == '__main__':
n = 0
p = raw_input('input a octal number:\n')
for i in range(len(p)):
n = n * 8 + ord(p[i]) - ord('0')
print n
题目:求0—7所能组成的奇数个数。
#!/usr/bin/python
# -*- coding: UTF-8 -*-
if __name__ == '__main__':
sum = 4
s = 4
for j in range(2,9):
print sum
if j <= 2:
s *= 7
else:
s *= 8
sum += s
print 'sum = %d' % sum
题目:连接字符串。
#!/usr/bin/python
# -*- coding: UTF-8 -*-
delimiter = ','
mylist = ['Brazil', 'Russia', 'India', 'China']
print delimiter.join(mylist)
题目:输入一个奇数,然后判断最少几个 9 除于该数的结果为整数。
#!/usr/bin/python
# -*- coding: UTF-8 -*-
if __name__ == '__main__':
zi = int(raw_input('输入一个数字:\n'))
n1 = 1
c9 = 1
m9 = 9
sum = 9
while n1 != 0:
if sum % zi == 0:
n1 = 0
else:
m9 *= 10
sum += m9
c9 += 1
print '%d 个 9 可以被 %d 整除 : %d' % (c9,zi,sum)
r = sum / zi
print '%d / %d = %d' % (sum,zi,r)
题目:两个字符串连接程序。
#!/usr/bin/python
# -*- coding: UTF-8 -*-
if __name__ == '__main__':
a = "acegikm"
b = "bdfhjlnpq"
# 连接字符串
c = a + b
print c
题目:读取7个数(1—50)的整数值,每读取一个值,程序打印出该值个数的*。
#!/usr/bin/python
# -*- coding: UTF-8 -*-
if __name__ == '__main__':
n = 1
while n <= 7:
a = int(raw_input('input a number:\n'))
while a < 1 or a > 50:
a = int(raw_input('input a number:\n'))
print a * '*'
n += 1
题目:某个公司采用公用电话传递数据,数据是四位的整数,在传递过程中是加密的,加密规则如下:每位数字都加上5,然后用和除以10的余数代替该数字,再将第一位和第四位交换,第二位和第三位交换。
#!/usr/bin/python
# -*- coding: UTF-8 -*-
from sys import stdout
if __name__ == '__main__':
a = int(raw_input('输入四个数字:\n'))
aa = []
aa.append(a % 10)
aa.append(a % 100 / 10)
aa.append(a % 1000 / 100)
aa.append(a / 1000)
for i in range(4):
aa[i] += 5
aa[i] %= 10
for i in range(2):
aa[i],aa[3 - i] = aa[3 - i],aa[i]
for i in range(3,-1,-1):
stdout.write(str(aa[i]))
题目:列表使用实例。
#!/usr/bin/python
# -*- coding: UTF-8 -*-
#list
#新建列表
testList=[10086,'中国移动',[1,2,4,5]]
#访问列表长度
print len(testList)
#到列表结尾
print testList[1:]
#向列表添加元素
testList.append('i\'m new here!')
print len(testList)
print testList[-1]
#弹出列表的最后一个元素
print testList.pop(1)
print len(testList)
print testList
#list comprehension
#后面有介绍,暂时掠过
matrix = [[1, 2, 3],
[4, 5, 6],
[7, 8, 9]]
print matrix
print matrix[1]
col2 = [row[1] for row in matrix]#get a column from a matrix
print col2
col2even = [row[1] for row in matrix if row[1] % 2 == 0]#filter odd item
print col2even
题目:时间函数举例2。
#!/usr/bin/python
# -*- coding: UTF-8 -*-
if __name__ == '__main__':
import time
start = time.time()
for i in range(3000):
print i
end = time.time()
print end - start
题目:时间函数举例4,一个猜数游戏,判断一个人反应快慢。
#!/usr/bin/python
# -*- coding: UTF-8 -*-
if __name__ == '__main__':
import time
import random
play_it = raw_input('do you want to play it.(\'y\' or \'n\')')
while play_it == 'y':
c = raw_input('input a character:\n')
i = random.randint(0,2**32) % 100
print 'please input number you guess:\n'
start = time.clock()
a = time.time()
guess = int(raw_input('input your guess:\n'))
while guess != i:
if guess > i:
print 'please input a little smaller'
guess = int(raw_input('input your guess:\n'))
else:
print 'please input a little bigger'
guess = int(raw_input('input your guess:\n'))
end = time.clock()
b = time.time()
var = (end - start) / 18.2
print var
# print 'It took you %6.3 seconds' % time.difftime(b,a))
if var < 15:
print 'you are very clever!'
elif var < 25:
print 'you are normal!'
else:
print 'you are stupid!'
print 'Congradulations'
print 'The number you guess is %d' % i
play_it = raw_input('do you want to play it.')
题目:计算字符串中子串出现的次数。
#!/usr/bin/python
# -*- coding: UTF-8 -*-
if __name__ == '__main__':
str1 = raw_input('请输入一个字符串:\n')
str2 = raw_input('请输入一个子字符串:\n')
ncount = str1.count(str2)
print ncount
题目:从键盘输入一些字符,逐个把它们写到磁盘文件上,直到输入一个 # 为止。
#!/usr/bin/python
# -*- coding: UTF-8 -*-
if __name__ == '__main__':
from sys import stdout
filename = raw_input('输入文件名:\n')
fp = open(filename,"w")
ch = raw_input('输入字符串:\n')
while ch != '#':
fp.write(ch)
stdout.write(ch)
ch = raw_input('')
fp.close()
题目:从键盘输入一个字符串,将小写字母全部转换成大写字母,然后输出到一个磁盘文件"test"中保存。
#!/usr/bin/python
# -*- coding: UTF-8 -*-
if __name__ == '__main__':
fp = open('test.txt','w')
string = raw_input('please input a string:\n')
string = string.upper()
fp.write(string)
fp = open('test.txt','r')
print fp.read()
fp.close()
题目:有两个磁盘文件A和B,各存放一行字母,要求把这两个文件中的信息合并(按字母顺序排列), 输出到一个新文件C中。
#!/usr/bin/python
# -*- coding: UTF-8 -*-
if __name__ == '__main__':
import string
fp = open('test1.txt')
a = fp.read()
fp.close()
fp = open('test2.txt')
b = fp.read()
fp.close()
fp = open('test3.txt','w')
l = list(a + b)
l.sort()
s = ''
s = s.join(l)
fp.write(s)
fp.close()
题目:列表转换为字典。
#!/usr/bin/python
# -*- coding: UTF-8 -*-
i = ['a', 'b']
l = [1, 2]
print dict([i,l])
题目:获取 100 以内的质数。
#!/usr/bin/python
# -*- coding: UTF-8 -*-
num=[];
i=2
for i in range(2,100):
j=2
for j in range(2,i):
if(i%j==0):
break
else:
num.append(i)
print(num)
Python拓展阅读:
发展历程
自20世纪90年代初Python语言诞生至今,它已被逐渐广泛应用于系统管理任务的处理和Web编程。
1995年,Guido van Rossum在弗吉尼亚州的国家创新研究公司(CNRI)继续他在Python上的工作,并在那里发布了该软件的多个版本。 [1]
2000年五月,Guido van Rossum和Python核心开发团队转到BeOpen.com并组建了BeOpen PythonLabs团队。同年十月,BeOpen PythonLabs团队转到Digital Creations(现为Zope Corporation)。 [1]
2001年,Python软件基金会(PSF)成立,这是一个专为拥有Python相关知识产权而创建的非营利组织。Zope Corporation是PSF的赞助成员。 [1]
Python的创始人为荷兰人吉多·范罗苏姆(Guido van Rossum)。1989年圣诞节期间,在阿姆斯特丹,Guido为了打发圣诞节的无趣,决心开发一个新的脚本解释程序,作为ABC语言的一种继承。之所以选中单词Python(意为大蟒蛇)作为该编程语言的名字,是因为英国20世纪70年代首播的电视喜剧《蒙提·派森的飞行马戏团》(Monty Python’s Flying Circus)。
ABC是由Guido参加设计的一种教学语言。就Guido本人看来,ABC这种语言非常优美和强大,是专门为非专业程序员设计的。但是ABC语言并没有成功,究其原因,Guido认为是其非开放造成的。Guido决心在Python中避免这一错误。同时,他还想实现在ABC中闪现过但未曾实现的东西。
就这样,Python在Guido手中诞生了。可以说,Python是从ABC发展起来,主要受到了Modula-3(另一种相当优美且强大的语言,为小型团体所设计的)的影响。并且结合了Unix shell和C的习惯。
Python [7]已经成为最受欢迎的程序设计语言之一。自从2004年以后,python的使用率呈线性增长。Python 2于2000年10月16日发布,稳定版本是Python 2.7。Python 3于2008年12月3日发布,不完全兼容Python 2。 [6]2011年1月,它被TIOBE编程语言排行榜评为2010年度语言。
标识
由于Python语言的简洁性、易读性以及可扩展性,在国外用Python做科学计算的研究机构日益增多,一些知名大学已经采用Python来教授程序设计课程。例如卡耐基梅隆大学的编程基础、麻省理工学院的计算机科学及编程导论就使用Python语言讲授。众多开源的科学计算软件包都提供了Python的调用接口,例如著名的计算机视觉库OpenCV、三维可视化库VTK、医学图像处理库ITK。而Python专用的科学计算扩展库就更多了,例如如下3个十分经典的科学计算扩展库:NumPy、SciPy和matplotlib,它们分别为Python提供了快速数组处理、数值运算以及绘图功能。因此Python语言及其众多的扩展库所构成的开发环境十分适合工程技术、科研人员处理实验数据、制作图表,甚至开发科学计算应用程序。2018年3月,该语言作者在邮件列表上宣布Python 2.7将于2020年1月1日终止支持。用户如果想要在这个日期之后继续得到与Python 2.7有关的支持,则需要付费给商业供应商。
语言特点
优点
简单:Python是一种代表简单主义思想的语言。阅读一个良好的Python程序就感觉像是在读英语一样。它使你能够专注于解决问题而不是去搞明白语言本身。
易学:Python极其容易上手,因为Python有极其简单的说明文档 [8]。
易读、易维护:风格清晰划一、强制缩进
用途广泛
速度较快:Python的底层是用C语言写的,很多标准库和第三方库也都是用C写的,运行速度非常快。 [7]
免费、开源:Python是FLOSS(自由/开放源码软件)之一。使用者可以自由地发布这个软件的拷贝、阅读它的源代码、对它做改动、把它的一部分用于新的自由软件中。FLOSS是基于一个团体分享知识的概念。
高层语言:用Python语言编写程序的时候无需考虑诸如如何管理你的程序使用的内存一类的底层细节。
可移植性:由于它的开源本质,Python已经被移植在许多平台上(经过改动使它能够工作在不同平台上)。这些平台包括Linux、Windows、FreeBSD、Macintosh、Solaris、OS/2、Amiga、AROS、AS/400、BeOS、OS/390、z/OS、Palm OS、QNX、VMS、Psion、Acom RISC OS、VxWorks、PlayStation、Sharp Zaurus、Windows CE、PocketPC、Symbian以及Google基于linux开发的android平台。
解释性:一个用编译性语言比如C或C++写的程序可以从源文件(即C或C++语言)转换到一个你的计算机使用的语言(二进制代码,即0和1)。这个过程通过编译器和不同的标记、选项完成。
运行程序的时候,连接/转载器软件把你的程序从硬盘复制到内存中并且运行。而Python语言写的程序不需要编译成二进制代码。你可以直接从源代码运行程序。
在计算机内部,Python解释器把源代码转换成称为字节码的中间形式,然后再把它翻译成计算机使用的机器语言并运行。这使得使用Python更加简单。也使得Python程序更加易于移植。
面向对象:Python既支持面向过程的编程也支持面向对象的编程。在“面向过程”的语言中,程序是由过程或仅仅是可重用代码的函数构建起来的。在“面向对象”的语言中,程序是由数据和功能组合而成的对象构建起来的。
Python是完全面向对象的语言。函数、模块、数字、字符串都是对象。并且完全支持继承、重载、派生、多继承,有益于增强源代码的复用性。Python支持重载运算符和动态类型。相对于Lisp这种传统的函数式编程语言,Python对函数式设计只提供了有限的支持。有两个标准库(functools,itertools)提供了Haskell和Standard ML中久经考验的函数式程序设计工具。
可扩展性、可扩充性:如果需要一段关键代码运行得更快或者希望某些算法不公开,可以部分程序用C或C++编写,然后在Python程序中使用它们。
Python本身被设计为可扩充的。并非所有的特性和功能都集成到语言核心。Python提供了丰富的API和工具,以便程序员能够轻松地使用C语言、C++、Cython来编写扩充模块。Python编译器本身也可以被集成到其它需要脚本语言的程序内。因此,很多人还把Python作为一种“胶水语言”(glue language)使用。使用Python将其他语言编写的程序进行集成和封装。在Google内部的很多项目,例如Google Engine使用C++编写性能要求极高的部分,然后用Python或Java/Go调用相应的模块。《Python技术手册》的作者马特利(Alex Martelli)说:“这很难讲,不过,2004年,Python已在Google内部使用,Google 召募许多 Python 高手,但在这之前就已决定使用Python,他们的目的是 Python where we can,C++ where we must,在操控硬件的场合使用C++,在快速开发时候使用Python。”
可嵌入性:可以把Python嵌入C/C++程序,从而向程序用户提供脚本功能。
丰富的库:Python标准库确实很庞大。它可以帮助处理各种工作,包括正则表达式、文档生成、单元测试、线程、数据库、网页浏览器、CGI、FTP、电子邮件、XML、XML-RPC、HTML、WAV文件、密码系统、GUI(图形用户界面)、Tk和其他与系统有关的操作。这被称作Python的“功能齐全”理念。除了标准库以外,还有许多其他高质量的库,如wxPython、Twisted和Python图像库等等。
规范的代码:Python采用强制缩进的方式使得代码具有较好可读性。而Python语言写的程序不需要编译成二进制代码。Python的作者设计限制性很强的语法,使得不好的编程习惯(例如if语句的下一行不向右缩进)都不能通过编译。其中很重要的一项就是Python的缩进规则。一个和其他大多数语言(如C)的区别就是,一个模块的界限,完全是由每行的首字符在这一行的位置来决定(而C语言是用一对大括号来明确的定出模块的边界,与字符的位置毫无关系)。通过强制程序员们缩进(包括if,for和函数定义等所有需要使用模块的地方),Python确实使得程序更加清晰和美观。
高级动态编程:虽然Python可能被粗略地分类为“脚本语言”(script language),但实际上一些大规模软件开发计划例如Zope、Mnet及BitTorrent,Google也广泛地使用它。Python的支持者较喜欢称它为一种高级动态编程语言,原因是“脚本语言”泛指仅作简单程序设计任务的语言,如shellscript、VBScript等只能处理简单任务的编程语言,并不能与Python相提并论。
做科学计算优点多:说起科学计算,首先会被提到的可能是MATLAB。除了MATLAB的一些专业性很强的工具箱还无法被替代之外,MATLAB的大部分常用功能都可以在Python世界中找到相应的扩展库。和MATLAB相比,用Python做科学计算有如下优点:
●首先,MATLAB是一款商用软件,并且价格不菲。而Python完全免费,众多开源的科学计算库都提供了Python的调用接口。用户可以在任何计算机上免费安装Python及其绝大多数扩展库。
●其次,与MATLAB相比,Python是一门更易学、更严谨的程序设计语言。它能让用户编写出更易读、易维护的代码。
●最后,MATLAB主要专注于工程和科学计算。然而即使在计算领域,也经常会遇到文件管理、界面设计、网络通信等各种需求。而Python有着丰富的扩展库,可以轻易完成各种高级任务,开发者可以用Python实现完整应用程序所需的各种功能。
缺点
单行语句和命令行输出问题:很多时候不能将程序连写成一行,如import sys;for i in sys.path:print i。而perl和awk就无此限制,可以较为方便的在shell下完成简单程序,不需要如Python一样,必须将程序写入一个.py文件。
给初学者带来困惑:独特的语法,这也许不应该被称为局限,但是它用缩进来区分语句关系的方式还是给很多初学者带来了困惑。即便是很有经验的Python程序员,也可能陷入陷阱当中。
运行速度慢:这里是指与C和C++相比。Python开发人员尽量避开不成熟或者不重要的优化。一些针对非重要部位的加快运行速度的补丁通常不会被合并到Python内。所以很多人认为Python很慢。不过,根据二八定律,大多数程序对速度要求不高。在某些对运行速度要求很高的情况,Python设计师倾向于使用JIT技术,或者用使用C/C++语言改写这部分程序。可用的JIT技术是PyPy。
和其他语言区别
对于一个特定的问题,只要有一种最好的方法来解决
这在由Tim Peters写的Python格言(称为The Zen of Python)里面表述为:There should be one-and preferably only one-obvious way to do it。这正好和Perl语言(另一种功能类似的高级动态语言)的中心思想TMTOWTDI(There’s More Than One Way To Do It)完全相反。
Python的设计哲学是“优雅”、“明确”、“简单”。因此,Perl语言中“总是有多种方法来做同一件事”的理念在Python开发者中通常是难以忍受的。Python开发者的哲学是“用一种方法,最好是只有一种方法来做一件事”。在设计Python语言时,如果面临多种选择,Python开发者一般会拒绝花俏的语法,而选择明确的没有或者很少有歧义的语法。由于这种设计观念的差异,Python源代码通常被认为比Perl具备更好的可读性,并且能够支撑大规模的软件开发。这些准则被称为Python格言。在Python解释器内运行import this可以获得完整的列表。
更高级的Virtual Machine
Python在执行时,首先会将.py文件中的源代码编译成Python的byte code(字节码),然后再由Python Virtual Machine(Python虚拟机)来执行这些编译好的byte code。这种机制的基本思想跟Java,.NET是一致的。然而,Python Virtual Machine与Java或.NET的Virtual Machine不同的是,Python的Virtual Machine是一种更高级的Virtual Machine。这里的高级并不是通常意义上的高级,不是说Python的Virtual Machine比Java或.NET的功能更强大,而是说和Java 或.NET相比,Python的Virtual Machine距离真实机器的距离更远。或者可以这么说,Python的Virtual Machine是一种抽象层次更高的Virtual Machine。基于C的Python编译出的字节码文件,通常是.pyc格式。除此之外,Python还可以以交互模式运行,比如主流操作系统Unix/Linux、Mac、Windows都可以直接在命令模式下直接运行Python交互环境。直接下达操作指令即可实现交互操作。
基本语法
Python的设计目标之一是让代码具备高度的可阅读性。它设计时尽量使用其它语言经常使用的标点符号和英文单字,让代码看起来整洁美观。它不像其他的静态语言如C、Pascal那样需要重复书写声明语句,也不像它们的语法那样经常有特殊情况和意外。
Python开发者有意让违反了缩进规则的程序不能通过编译,以此来强制程序员养成良好的编程习惯。并且Python语言利用缩进表示语句块的开始和退出(Off-side规则),而非使用花括号或者某种关键字。增加缩进表示语句块的开始,而减少缩进则表示语句块的退出。缩进成为了语法的一部分。例如if语句:python3
age = int(input("请输入你的年龄: "))
if age < 21:
print("你不能买酒。")
print("不过你能买口香糖。")
print("这句话在if语句块的外面。")
根据PEP的规定,必须使用4个空格来表示每级缩进。使用Tab字符和其它数目的空格虽然都可以编译通过,但不符合编码规范。支持Tab字符和其它数目的空格仅仅是为兼容很旧的的Python程序和某些有问题的编辑程序。
控制语句
if语句,当条件成立时运行语句块。经常与else,elif(相当于else if)配合使用,称为if-elif-else语句。
for语句,遍历列表、字符串、字典、集合等迭代器(容器),依次处理迭代器中的每个元素。有时和else连用,称为for-else语句。
while语句,当条件为真时,循环运行语句块。有时和else配合使用,称为while-else语句。
try语句,必与except配合使用处理在程序运行中出现的异常情况,称为try-except语句。常与else,finally配合使用,称为try-except-else语句,try-except-finally语句,try-except-else-finally语句
class语句,用于定义类型。
def语句,用于定义函数和类型的方法。
pass语句,表示此行为空,不运行任何操作。
assert语句,用于程序调试阶段时测试运行条件是否满足。
with语句,Python2.6以后定义的语法,在一个场景中运行语句块。比如,运行语句块前加密,然后在语句块运行退出后解密。
yield语句,在迭代器函数内使用,用于返回一个元素。自从Python 2.5版本以后。这个语句变成一个运算符。
raise语句,制造一个错误。
import语句,导入一个模块或包。
from…import语句,从包导入模块或从模块导入某个对象。
import…as语句,将导入的对象赋值给一个变量。
in语句,判断一个对象是否在一个字符串/列表/元组里。
表达式
Python的表达式写法与C、C++类似。只是在某些写法有所差别。
算数运算符
Python主要的算术运算符与C、C++类似。
逻辑运算符
Python使用and,or,not表示逻辑运算。
is,is not用于比较两个变量是否是同一个对象。in,not in用于判断一个对象是否属于另外一个对象。
Python支持“列表推导式”(list comprehension),比如计算0-9的平方和:
>>> sum(x * x for x in range(10))
285
匿名函数
Python使用lambda表示匿名函数。匿名函数体只能是表达式。比如:
>>> add=lambda x, y : x + y
>>> add(3,2)
5
条件表达式
Python使用y if cond else x表示条件表达式。意思是当cond为真时,表达式的值为y,否则表达式的值为x。相当于C++和Java里的cond?y:x。
数据语法
Python区分列表(list)和元组(tuple)两种类型。list的写法是[1,2,3],而tuple的写法是(1,2,3)。可以改变list中的元素,而不能改变tuple。在某些情况下,tuple的括号可以省略。tuple对于赋值语句有特殊的处理。因此,可以同时赋值给多个变量,比如:
>>> x, y=1,2 # 同时给x,y赋值,最终结果:x=1, y=2
特别地,可以使用以下这种形式来交换两个变量的值:
>>> x, y=y, x #最终结果:y=1, x=2
Python使用’(单引号)和"(双引号)来表示单行字符串,用’‘’(三个连续单引号)和"“”(三个连续双引号)与Perl、Unix Shell语言或者Ruby、Groovy等语言不一样,两种符号作用相同。一般地,如果字符串中出现了双引号,就使用单引号来表示字符串;反之则使用双引号。如果都没有出现,就依个人喜好选择。出现在字符串中的\(反斜杠)被解释为特殊字符,比如\n表示换行符。表达式前加r指示Python不解释字符串中出现的\。这种写法通常用于编写正则表达式或者Windows文件路径。
Python支持列表切割(list slices),可以取得完整列表的一部分。支持切割操作的类型有str,bytes,list,tuple等。它的语法是…[left:right]或者…[left:right:stride]。假定nums变量的值是[1,3,5,7,8,13,20],那么下面几个语句为真:
nums[2:5][5,7,8]从下标为2的元素切割到下标为5的元素,但不包含下标为5的元素。
nums[1:][3,5,7,8,13,20]切割到最后一个元素。 nums[:-3][1,3,5,7]
从最开始的元素一直切割到倒数第3个元素。 nums[:][1,3,5,7,8,13,20]返回所有元素。改变新的列表不会影响到nums。
nums[1:5:2]==[3,7]从下标为1的元素切割到下标为5的元素,且步长为2。
函数
Python函数支持递归、默认参数值、可变参数,但不支持函数重载。为了增强代码的可读性,可以在函数后书写“文档字符串”(Documentation Strings,或者简称docstrings),用于解释函数的作用、参数的类型与意义、返回值类型与取值范围等。可以使用内置函数help打印出函数的使用帮助。比如:
def randint(a,b):
… “Return random integer in range [a,b],including both end points.”
help(randint)
Help on function randint in module main:
randint(a,b)
Return random integer inrange[a,b],including both end points.
对象的方法
对象的方法是指绑定到对象的函数。调用对象方法的语法是instance.method(arguments)。它等价于调用Class.method(instance,arguments)。当定义对象方法时,必须显式地定义第一个参数,一般该参数名都使用self,用于访问对象的内部数据。这里的self相当于C++,Java里面的this变量,但是我们还可以使用任何其它合法的参数名,比如this 和 mine 等,self与C++,Java里面的this不完全一样,它可以被看作是一个习惯性的用法,我们传入任何其它的合法名称都行,比如:
class Fish:
def eat(self,food):
if food is not None:
self.hungry=False
class User:
def __init__(myself,name):
myself.name=name
#构造Fish的实例:
f=Fish()
#以下两种调用形式是等价的:
Fish.eat(f,"earthworm")
f.eat("earthworm")
u=User('username')
print(u.name)
Python认识一些以“”开始并以“”结束的特殊方法名,它们用于实现运算符重载和实现多种特殊功能,叫做魔法方法。
数据类型
Python采用动态类型系统。在编译的时候,Python不会检查对象是否拥有被调用的方法或者属性,而是直至运行时,才做出检查。所以操作对象时可能会抛出异常。不过,虽然Python采用动态类型系统,它同时也是强类型的。Python禁止没有明确定义的操作,比如数字加字符串。
与其它面向对象语言一样,Python允许程序员定义类型。构造一个对象只需要像函数一样调用类型即可,比如,对于前面定义的Fish类型,使用Fish。类型本身也是特殊类型type的对象(type类型本身也是type对象),这种特殊的设计允许对类型进行反射编程。
Python内置丰富的数据类型。与Java、C++相比,这些数据类型有效地减少代码的长度。下面这个列表简要地描述了Python内置数据类型(适用于Python 3.x):
除了各种数据类型,Python语言还用类型来表示函数、模块、类型本身、对象的方法、编译后的Python代码、运行时信息等等。因此,Python具备很强的动态性。
数学运算
Python使用与C、Java类似的运算符,支持整数与浮点数的数学运算。同时还支持复数运算与无穷位数
import math
print(math.sin(math.pi/2))
1.0
fractions模块用于支持分数运算;decimal模块用于支持高精度的浮点数运算。
Python定义求余运行a % b的值处于开区间[0,b)内,如果b是负数,开区间变为(b,0]。这是一个很常见的定义方式。不过其实它依赖于整除的定义。为了让方程式:b * ( a // b)+ a % b = a恒真,整除运行需要向负无穷小方向取值。比如7 //3的结果是2,而(-7)//3的结果却是-3。这个算法与其它很多编程语言不一样,需要注意,它们的整除运算会向0的方向取值。
Python允许像数学的常用写法那样连着写两个比较运行符。比如a < b < c与a < b and b < c等价。C++的结果与Python不一样,首先它会先计算a < b,根据两者的大小获得0或者1两个值之一,然后再与c进行比较。
帮助
>>>import math
>>>dir(math)
['__doc__', '__loader__', '__name__', '__package__', '__spec__', 'acos', 'acosh', 'asin', 'asinh', 'atan', 'atan2', 'atanh', 'ceil', 'copysign', 'cos', 'cosh', 'degrees', 'e', 'erf', 'erfc', 'exp', 'expm1', 'fabs', 'factorial', 'floor', 'fmod', 'frexp', 'fsum', 'gamma', 'gcd', 'hypot', 'inf', 'isclose', 'isfinite', 'isinf', 'isnan', 'ldexp', 'lgamma', 'log', 'log10', 'log1p', 'log2', 'modf', 'nan', 'pi', 'pow', 'radians', 'sin', 'sinh', 'sqrt', 'tan', 'tanh', 'tau', 'trunc']
这个例子列出math模块的一些函数,以双下划线( _ _ )开头的名称用于较复杂的python编程。
2.查看完整的python内置函数清单
查看完整的python内置函数清单,可在提示符后输入 dir(_ builtins _)。
例子:
>>> dir(__builtins__)
['ArithmeticError', 'AssertionError', 'AttributeError', 'BaseException', 'BlockingIOError', 'BrokenPipeError', 'BufferError', 'BytesWarning', 'ChildProcessError', 'ConnectionAbortedError', 'ConnectionError', 'ConnectionRefusedError', 'ConnectionResetError', 'DeprecationWarning', 'EOFError', 'Ellipsis', 'EnvironmentError', 'Exception', 'False', 'FileExistsError', 'FileNotFoundError', 'FloatingPointError', 'FutureWarning', 'GeneratorExit', 'IOError', 'ImportError', 'ImportWarning', 'IndentationError', 'IndexError', 'InterruptedError', 'IsADirectoryError', 'KeyError', 'KeyboardInterrupt', 'LookupError', 'MemoryError', 'ModuleNotFoundError', 'NameError', 'None', 'NotADirectoryError', 'NotImplemented', 'NotImplementedError', 'OSError', 'OverflowError', 'PendingDeprecationWarning', 'PermissionError', 'ProcessLookupError', 'RecursionError', 'ReferenceError', 'ResourceWarning', 'RuntimeError', 'RuntimeWarning', 'StopAsyncIteration', 'StopIteration', 'SyntaxError', 'SyntaxWarning', 'SystemError', 'SystemExit', 'TabError', 'TimeoutError', 'True', 'TypeError', 'UnboundLocalError', 'UnicodeDecodeError', 'UnicodeEncodeError', 'UnicodeError', 'UnicodeTranslateError', 'UnicodeWarning', 'UserWarning', 'ValueError', 'Warning', 'WindowsError', 'ZeroDivisionError', '_', '__build_class__', '__debug__', '__doc__', '__import__', '__loader__', '__name__', '__package__', '__spec__', 'abs', 'all', 'any', 'ascii', 'bin', 'bool', 'bytearray', 'bytes', 'callable', 'chr', 'classmethod', 'compile', 'complex', 'copyright', 'credits', 'delattr', 'dict', 'dir', 'divmod', 'enumerate', 'eval', 'exec', 'exit', 'filter', 'float', 'format', 'frozenset', 'getattr', 'globals', 'hasattr', 'hash', 'help', 'hex', 'id', 'input', 'int', 'isinstance', 'issubclass', 'iter', 'len', 'license', 'list', 'locals', 'map', 'max', 'memoryview', 'min', 'next', 'object', 'oct', 'open', 'ord', 'pow', 'print', 'property', 'quit', 'range', 'repr', 'reversed', 'round', 'set', 'setattr', 'slice', 'sorted', 'staticmethod', 'str', 'sum', 'super', 'tuple', 'type', 'vars', 'zip']
3.查看某个函数的文档帮助信息
可以用函数help(函数)来查看某个函数的文档帮助信息。
例子:
>>>help(sum)
Help on built-in function sum in module builtins:
sum(iterable, start=0, /)
Return the sum of a 'start' value (default: 0) plus an iterable of numbers When the iterable is empty, return the start value.
This function is intended specifically for use with numeric values and may reject non-numeric types.
可以直接在提示符下输入help(),然后输入某个模块或函数名得到详细的帮助信息。
接口
CGI 目前由NCSA维护,NCSA定义CGI如下: [7]
CGI(Common Gateway Interface),通用网关接口,它是一段程序,运行在服务器上如:HTTP服务器,提供同客户端HTML页面的接口。
CGI程序可以是Python脚本、Perl脚本、Shell脚本、C或者C++程序等。
服务器
在你进行CGI编程前,确保您的Web服务器支持CGI及已经配置了CGI的处理程序。
所有的HTTP服务器执行CGI程序都保存在一个预先配置的目录。这个目录被称为CGI目录,并按照惯例,它被命名为/var/www/cgi-bin目录。
CGI文件的扩展名为.cgi,python也可以使用.py扩展名。
默认情况下,Linux服务器配置运行的cgi-bin目录中为/var/www。
如果想指定的其他运行CGI脚本的目录,可以修改httpd.conf配置文件,如下所示:
<Directory"/var/www/cgi-bin">
Allow Override None
Options ExecCGI
Order allow,deny
Allow from all
</Directory>
<Directory"/var/www/cgi-bin">
Options All
</Directory>
程序
使用Python创建第一个CGI程序,文件名为hello.py,文件位于/var/www/cgi-bin目录中,内容如下,修改文件的权限为755:
#!/usr/bin/env python
print("Content-type:text/html\r\n\r\n")
print("<html>")
print("<head>")
print("")
print("</head>")
print("<body>")
print("<h2>Hello World! This is my first CGI program</h2>")
print("</body>")
print("</html>")
以上程序在浏览器访问显示结果如下:
Hello World! This is my first CGI program
这个的hello.py脚本是一个简单的Python脚本,脚本第一的输出内容"Content-type:text/html\r\n\r\n"发送到浏览器并告知浏览器显示的内容类型为"text/html"。
环境变量
所有的CGI程序都接收以下的环境变量,这些变量在CGI程序中发挥了重要的作用:
以下是一个简单的CGI脚本输出CGI的环境变量:
#!/usr/bin/python
import os
print("Content-type:text/html\r\n\r\n")
print("Environment")
for param in os.environ.keys():
print"<b>%20s</b>:%s<\br>" %(param,os.environ[param])
应用领域
Python是一种解释型脚本语言,可以应用于以下领域:
Web 和 Internet开发
科学计算和统计
人工智能
桌面界面开发
软件开发
后端开发
网络接口:能方便进行系统维护和管理,Linux下标志性语言之一,是很多系统管理员理想的编程工具。
图形处理:有PIL、Tkinter等图形库支持,能方便进行图形处理。
数学处理:NumPy扩展提供大量与许多标准数学库的接口。
文本处理:python提供的re模块能支持正则表达式,还提供SGML,XML分析模块,许多程序员利用python进行XML程序的开发。
数据库编程:程序员可通过遵循Python DB-API(应用程序编程接口)规范的模块与Microsoft SQL Server,Oracle,Sybase,DB2,MySQL、SQLite等数据库通信。python自带有一个Gadfly模块,提供了一个完整的SQL环境。
网络编程:提供丰富的模块支持sockets编程,能方便快速地开发分布式应用程序。很多大规模软件开发计划例如Zope,Mnet 及BitTorrent. Google都在广泛地使用它。
Web编程:应用的开发语言,支持最新的XML技术。
多媒体应用:Python的PyOpenGL模块封装了“OpenGL应用程序编程接口”,能进行二维和三维图像处理。PyGame模块可用于编写游戏软件。
pymo引擎:PYMO全称为python memories off,是一款运行于Symbian S60V3,Symbian3,S60V5,Symbian3,Android系统上的AVG游戏引擎。因其基于python2.0平台开发,并且适用于创建秋之回忆(memories off)风格的AVG游戏,故命名为PYMO。
黑客编程:python有一个hack的库,内置了你熟悉的或不熟悉的函数,但是缺少成就感。
用Python写简单爬虫
首先,要通过urllib2这个Module获得对应的HTML源码(PS:在python3.3之后urllib2已经不能再用,代之以urllib)。
import urllib2 #调用urllib2
url='http://www.baidu.com/s?wd=cloga' #把等号右边的网址赋值给url
html=urllib2.urlopen(url).read() #html随意取名 等号后面的动作是打开源代码页面,并阅读
print html #打印
通过上面这三句就可以将URL的源码存在content变量中,其类型为字符型。
接下来是要从这堆HTML源码中提取我们需要的内容。用Chrome查看一下对应的内容的代码(也可以用Firefox的Firebug)。
可以看到url的信息存储在span标签中,要获取其中的信息可以用正则表达式。
开发工具
Tkinter
Python默认的图形界面接口。Tkinter是一个和Tk接口的Python模块,Tkinter库提供了对Tk API的接口,它属于Tcl/Tk的GUI工具组。
PyGTK
用于python GUI程序开发的GTK+库。GTK就是用来实现GIMP和Gnome的库。
PyQt
用于python的Qt开发库。QT就是实现了KDE环境的那个库,由一系列的模块组成,有qt,qtcanvas,qtgl,qtnetwork,qtsql,qttable,qtui and qtxml,包含有300个类和超过5750个的函数和方法。PyQt还支持一个叫qtext的模块,它包含一个QScintilla库。该库是Scintillar编辑器类的Qt接口。
wxPython
GUI编程框架,熟悉MFC的人会非常喜欢,简直是同一架构(对于初学者或者对设计要求不高的用户来说,使用Boa Constructor可以方便迅速的进行wxPython的开发)属于外置库,要先下载。
PIL
python提供强大的图形处理的能力,并提供广泛的图形文件格式支持,该库能进行图形格式的转换、打印和显示。还能进行一些图形效果的处理,如图形的放大、缩小和旋转等。是Python用户进行图象处理的强有力工具。
Psyco
一个Python代码加速度器,可使Python代码的执行速度提高到与编译语言一样的水平。
xmpppy
Jabber服务器采用开发的XMPP协议,Google Talk也是采用XMPP协议的IM系统。在Python中有一个xmpppy模块支持该协议。也就是说,我们可以通过该模块与Jabber服务器通信,是不是很Cool。
PyMedia
用于多媒体操作的python模块。它提供了丰富而简单的接口用于多媒体处理(wav,mp3,ogg,avi,divx,dvd,cdda etc)。可在Windows和Linux平台下使用。
Pmw
Python megawidgets,Python超级GUI组件集,一个在python中利用Tkinter模块构建的高级GUI组件,每个Pmw都合并了一个或多个Tkinter组件,以实现更有用和更复杂的功能。
PyXML
用Python解析和处理XML文档的工具包,包中的4DOM是完全相容于W3C DOM规范的。它包含以下内容:
xmlproc:一个符合规范的XML解析器。Expat:一个快速的,非验证的XML解析器。还有其他和他同级别的还有 PyHtml PySGML。
PyGame
用于多媒体开发和游戏软件开发的模块。可以直接使用pip install pygame下载
PyOpenGL
模块封装了“OpenGL应用程序编程接口”,通过该模块python程序员可在程序中集成2D和3D的图形。
NumPy、NumArray、SAGE
NumArray是Python的一个扩展库,主要用于处理任意维数的固定类型数组,简单说就是一个矩阵库。它的底层代码使用C来编写,所以速度的优势很明显。SAGE是基于NumPy和其他几个工具所整合成的数学软件包,目标是取代Magma,Maple,Mathematica和Matlab 这类工具。
MySQLdb
用于连接MySQL数据库。还有用于zope的ZMySQLDA模块,通过它就可在zope中连接mysql数据库。
Sqlite3
用于连接sqlite数据库。
Python-ldap
提供一组面向对象的API,可方便地在python中访问ldap目录服务,它基于OpenLDAP2.x。
smtplib
发送电子邮件。
ftplib
定义了FTP类和一些方法,用以进行客户端的ftp编程。如果想了解ftp协议的详细内容,请参考RFC959。
PyOpenCL
OpenCL的Python接口,通过该模块可以使用GPU实现并行计算。
xes-lib
学而思库可用于发送邮件、查看天气等功能。
标准库
Python拥有一个强大的标准库。Python语言的核心只包含数字、字符串、列表、字典、文件等常见类型和函数,而由Python标准库提供了系统管理、网络通信、文本处理、数据库接口、图形系统、XML处理等额外的功能。Python标准库命名接口清晰、文档良好,很容易学习和使用。
Python社区提供了大量的第三方模块,使用方式与标准库类似。它们的功能无所不包,覆盖科学计算、Web开发、数据库接口、图形系统多个领域,并且大多成熟而稳定。第三方模块可以使用Python或者C语言编写。SWIG,SIP常用于将C语言编写的程序库转化为Python模块。Boost C++ Libraries包含了一组库,Boost.Python,使得以 Python 或 C++ 编写的程序能互相调用。借助于拥有基于标准库的大量工具、能够使用低级语言如C和可以作为其他库接口的C++,Python已成为一种强大的应用于其他语言与工具之间的胶水语言。
Python标准库的主要功能有:
文本处理,包含文本格式化、正则表达式匹配、文本差异计算与合并、Unicode支持,二进制数据处理等功能
文件处理,包含文件操作、创建临时文件、文件压缩与归档、操作配置文件等功能
操作系统功能,包含线程与进程支持、IO复用、日期与时间处理、调用系统函数、写日记(logging)等功能
网络通信,包含网络套接字,SSL加密通信、异步网络通信等功能
网络协议,支持HTTP,FTP,SMTP,POP,IMAP,NNTP,XMLRPC等多种网络协议,并提供了编写网络服务器的框架
W3C格式支持,包含HTML,SGML,XML的处理
其它功能,包括国际化支持、数学运算、HASH、Tkinter等
内置库
可以直接使用 import语句导入。
外部库
需要先下载,再在CMD命令窗口在pip.exe的同级目录下输入 pip install 库名。
main环境的外部库储存在python安装目录的Lib/site-packages文件夹中。
virtualenv的外部库在C:\Users\用户名\Envs\ENV环境名\Lib\site-packages文件夹中。
开发环境
工具
●IDLE:Python内置IDE(随python安装包提供)
●PyCharm:详见百度百科PyCharm,由著名的JetBrains公司开发,带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具,比如调试、语法高亮、Project管理、代码跳转、智能提示、自动完成、单元测试、版本控制。 [10]此外,该IDE提供了一些高级功能,以用于支持Django框架下的专业Web开发。
●Komodo和Komodo Edit:后者是前者的免费精简版
●Spyder:安装Anaconda自带的高级IDE
●PythonWin:ActivePython或pywin32均提供该IDE,仅适用于Windows
●SPE(Stani’s Python Editor):功能较多的自由软件,基于wxPython
●Ulipad:功能较全的自由软件,基于wxPython;作者是中国Python高手limodou
●WingIDE:可能是功能最全的IDE,但不是自由软件(教育用户和开源用户可以申请免费key)
●Eric:基于PyQt的自由软件,功能强大。全名是:The Eric Python IDE
●DrPython
●PyScripter:使用Delphi开发的轻量级的开源Python IDE,支持Python2.6和3.0。
●PyPE:一个开源的跨平台的PythonIDE。
●bpython:类Unix操作系统下使用curses库开发的轻量级的Python解释器。语法提示功能。
●eclipse+pydev插件:方便调试程序
●emacs:自带python支持,自动补全、refactor等功能需要插件支持
●Vim:最新7.3版编译时可以加入python支持,提供python代码自动提示支持
●Visual Studio 2003+VisualPython:仅适用Windows,已停止维护,功能较差
●SlickEdit
●Visual Studio 2010+Python Tools for Visual Studio
●TextMate
●Netbeans IDE
●Sublime
●ipython
另外,诸如Notepad++、EditPlus、UltraEdit等通用的程序员文本编辑器软件也能对Python代码编辑提供一定的支持,比如代码自动着色、注释快捷键等,但是否够得上集成开发环境的水平,尚有待评估。
解释器
Python是一门跨平台的脚本语言,Python规定了一个Python语法规则,实现了Python语法的解释程序就成为了Python的解释器。
CPython(ClassicPython,也就是原始的Python实现,需要区别于其他实现的时候才以CPython称呼;或解作C语言实现的Python)。这是最常用的Python版本。
Jython(原名JPython;Java语言实现的Python,现已正式发布)。Jython可以直接调用Java的各种函数库。
PyPy(使用Python语言写的Python)
IronPython(面向.NET和ECMA CLI的Python实现)。IronPython能够直接调用.net平台的各种函数库。可以将Python程序编译成.net程序。
ZhPy(周蟒)(支持使用繁/简中文语句编写程序的Python语言)
著名应用
Digwebs-Web应用框架
Pylons-Web应用框架
Zope-应用服务器
Plone-内容管理系统
Django-鼓励快速开发的Web应用框架
Uliweb-国人开发的轻量级Web框架
TurboGears-另一个Web应用快速开发框架
Twisted-Python的网络应用程序框架
flask-Python 微Web框架
tornado-非阻塞式服务器
Webpy-Python 微Web框架
Bottle-Python 微Web框架
EVE-网络游戏EVE大量使用Python进行开发
Reddit-社交分享网站
Dropbox-文件分享服务
TurboGears-另一个Web应用快速开发框架
Fabric-用于管理成百上千台Linux主机的程序库
Trac-使用Python编写的BUG管理系统
Mailman-使用Python编写的邮件列表软件
Mezzanine-基于Django编写的内容管理系统
Blender-以C与Python开发的开源3D绘图软件