程序源码下载:
https://pan.baidu.com/s/1bpKnVK7
目标: 熟悉Python代码,入门简单的算法题
学习知识点:
- 数据类型:
– integral:
– int
– bool
– 浮点
– 字符串 - 组合类型:
– 序列类型
– 集合类型
– 映射类型
1. 学习代码示例:
quadratic.py 求一元二次方程的解
运行效果:
import cmath
import math
import sys
#控制输入浮点数
def get_float(msg,allow_zero):
x = None
while x is None:
try:
x = float(input(msg))
if not allow_zero and abs(x) < sys.float_info.epsilon:
print("zero is not allowed")
x = None
except ValueError as err:
print(err)
return x
#获取三个参数
print("ax\N{SUPERSCRIPT TWO} + bx + c = 0")
a = get_float("enter a: ", False)
b = get_float("enter b: ", True)
c = get_float("enter c: ", True)
#求解方程
x1 = None
x2 = None
discriminant = (b ** 2) - (4 * a *c)
if discriminant == 0:#方程只有一个解
x1 = -(b / (2*a))
else:
if discriminant > 0:#方程有实数解
root = math.sqrt(discriminant)
else: #discriminant < 0 方程有复数解
root = cmath.sqrt(discriminant)
x1 = (-b + root)/(2 * a)
x2 = (-b - root)/(2 * a)
#控制输出
equation = ("{a}x\N{SUPERSCRIPT TWO}{b:+}x{c:+} = 0 " "\N{RIGHTWARDS ARROW} x={x1}").format(**locals())
if x2 is not None:
equation += "or x = {0}".format(x2)
print(equation)
cvs2html.py 将csv数据集转换为html
运行结果:
import sys
def main():
#文本最大宽度
maxwidth = 10
#输出html开始部分
print_start()
count = 0
#输出信息部分
while True:
try:
line = input()
if count == 0:
color = "lightgreen"
elif count % 2:
color = "white"
else:
color = "lightyellow"
print_line(line,color,maxwidth)
count += 1
except EOFError:#通过ctrl+d来终止程序
break
#输出html结束部分
print_end()
def print_start():
print("<table border='1'>")
def print_line(line,color,maxwidth):
print("<tr bgcolor='{}'>".format(color))
fields = extract_fields(line)
for field in fields:
if not field:
print("<td></td>")
else:
#number = field.replace(",","")
number = field
try:
x = float(number)#如果是数字
print("<td align='right'>{:d}</td>".format(round(x)))
except ValueError:#否则为单词
field = field.title()#将首字母变为大些,其他字母变小写
field = field.replace("And","and")#将And替换为and
if len(field) <= maxwidth:#如果字符串长度在规定长度内
field = escape_html(field)
else:
field = "{}...".format(escape_html(field[:maxwidth]))#截取maxwidth长度内的子串
print("<td>{}</td>".format(field))
print("</tr>")
def extract_fields(line):
fields = []
field = ""
quote = None
#"ARGE'N'TINA",37,35,33,36,39
for c in line:
if c in "\"'":
if quote is None:#获取第一个字符 "
quote = c
elif quote==c:#获取第一个字符串 结束字符 "
quote = None
else:#获取中间字符 ' '
field += c
continue
if quote is None and c==",":#字符串的结尾处,将获得的字符串添加至fields
fields.append(field)
field = ""
else:#获取中间字符,比如:ARGENTINA 37 35 33 36 39
field += c
if field:#最后一个字符串
fields.append(field)
#最后的fields是: [ARGE'N'TINA,37,35,33,36,39]
return fields
#替换特殊字符
def escape_html(text):
text = text.replace("&","&")
text = text.replace("<","<")
text = text.replace(">","&g")
return text
def print_end():
print("</table>")
main()
generate_usernames.py 为组织内的每个员工生成用户名
设置运行参数:
运行结果:
import sys
import collections
#定义5个常量
ID,FORENAME,MIDDLENAME,SURNAME,DEPARTMENT = range(5)
#定义User类
User = collections.namedtuple("User","username forename middlename surname id")
def generate_username(fields, usernames):
#取三个字段的部分和
username = ((fields[FORENAME][0] + fields[MIDDLENAME][:1] + fields[SURNAME]).replace("-","").replace("'",""))
username = orginal_name = username[:8].lower()
count = 1
#如果出现重名,则在后面的尾数加一
while username in usernames:
username = "{0}{1}".format(orginal_name,count)
#将username添加到usernames
usernames.add(username)
return username
def process_line(line, usernames):
#按冒号切割成单个字段
fields = line.split(":")
#计算username
username = generate_username(fields,usernames)
#构建user对象
user = User(username,fields[FORENAME],fields[MIDDLENAME],fields[SURNAME],fields[ID])
return user
#打印users
def print_user(users):
namewidth = 32
usernamewidth = 9
print("{0:<{nw}}{1:^6}{2:{uw}}".format("Name","ID","Username",nw=namewidth,uw=usernamewidth))
print("{0:-<{nw}}{0:-<6}{0:-<{uw}}".format("",nw=namewidth,uw=usernamewidth))
for key in sorted(users):
user = users[key]
initial = ""
if user.middlename:
initial = " "+user.middlename[0]
name = "{0.surname},{0.forename}{1}".format(user,initial)
print("{0:.<{nw}}({1.id:4}){1.username:{uw}}".format(name,user,nw=namewidth,uw=usernamewidth))
def main():
#输入参数检测
if len(sys.argv)==1 or sys.argv[1] in {"-h","help"}:
print("usage:{0} file1 [file2 [...fileN]]".format(sys.argv[0]))
sys.exit()
#用户名集合
usernames = set()
#用户map
users = {}
#遍历所有输入
for line in sys.argv[1:]:
line = line.rstrip()
if line:
#将一行信息转为user对象
user = process_line(line,usernames)
#将(user.surname.lower(),user.forename.lower(),user.id) ,user存入users
users[(user.surname.lower(),user.forename.lower(),user.id)] = user
print_user(users)
main()
statistics.py 统计信息,计算出count次数,mean平均数,median中位数,mode最高频率数,std.dev.标准差
argv参数设置为 statistics_data
statistics_data文件:
运行结果:
import math
import sys
import collections
#定义Statistics类
Statistics = collections.namedtuple("Statistics","mean mode median std_dev")
#读取文件,将数字存入number,将数字出现的次数存入frequencies
#越来越觉得Python像shell了
def read_data(filename, numbers, frequencies):
for lino,line in enumerate(open(filename,encoding="ascii"),start=1):
for x in line.split():
try:
number = float(x)
numbers.append(number)
frequencies[number] += 1
except ValueError as err:
print("{filename}:{lino}:skipping {x}:{err}".format(**locals()))
#计算中位数
def calcutale_median(numbers):
numbers = sorted(numbers)
middle = int(len(numbers)/2)
median = numbers[middle]
if len(numbers)%2==0:
median = (median + numbers[middle - 1])/2
return median
#计算标准差
def calcutale_std_dev(numbers, mean):
total = 0
for number in numbers:
total += ((number - mean)**2)
variance = total/(len(numbers) - 1)
return math.sqrt(variance)
#计算各项值
def calcutale_statistics(numbers,frequencies):
#求平均数
mean = sum(numbers)/len(numbers)
#求频率最高的数
mode = calcutale_mode(frequencies,3)
#计算中位数
median = calcutale_median(numbers)
#计算标准偏差
std_dev = calcutale_std_dev(numbers,mean)
return Statistics(mean,mode,median,std_dev)
#计算频率最高的数据
def calcutale_mode(frequencies,maximum_modes):
hightest_frequency = max(frequencies.values())
mode = [number for number,frequency in frequencies.items()
if frequency == hightest_frequency]
if not (1 <= len(mode) <= maximum_modes):
mode = None
else:
mode.sort()
return mode
#打印结果
def print_results(count,statistics):
real = "9.2f"
if statistics.mode is None:
modeline = ""
elif len(statistics.mode) == 1:
modeline = "mode ={0:{fmt}}\n".format(statistics.mode[0],fmt=real)
else:
modeline = ("mode =["+",".join(["{0:.2f}".format(m) for m in statistics.mode])+"]\n")
print("""
count ={0:6}
mean ={mean:{fmt}}
median ={median:{fmt}}
{1}\
std.dev. ={std_dev:{fmt}}
""".format(count,modeline,fmt=real,**statistics._asdict()))
def main():
#检测参数
if len(sys.argv) == 1 or sys.argv[1] in {"-h","--help"}:
print("usage:{0} file1 [file2 [...fileN]]".format(sys.argv[0]))
sys.exit()
#数字集合
numbers = []
#数字频率
frequencies = collections.defaultdict(int)
for filename in sys.argv[1:]:
read_data(filename,numbers,frequencies)
if numbers:
#统计
statistics = calcutale_statistics(numbers,frequencies)
#打印
print_results(len(numbers),statistics)
else:
print("no numbers found")
main()
小结
- abs(x) < sys.float_info.epsilon 判断x是否是0
- float(x) 将x转为float类型,类似有: int(x),hex(x),bin(x)等等
- print(“ax\N{SUPERSCRIPT TWO} + bx + c = 0”)特殊字符表示\N{…}
- b ** 2 计算b的平方,m ** n即m的n次方,如2 ** (1/2)等于2的平方根,注意负数哦!!!
- math.sqrt(x) x平方根 同理cmath.sqrt(x)复数级别的平方根
- fields.append(field)数组添加元素
- 定义5个常量ID,FORENAME,MIDDLENAME,SURNAME,DEPARTMENT = range(5)
- User = collections.namedtuple(“User”,”username forename middlename surname id”)定义User类
- users[(user.surname.lower(),user.forename.lower(),user.id)] = user相当于java的map,左边 集合名称[key] = value
- 定义集合users = {}
- “,”.join([“{0:.2f}”.format(m) for m in statistics.mode]) ,遍历statistics.mode,将每条结果通过”,”连接.
- mode = [number for number,frequency in frequencies.items()
if frequency == hightest_frequency] 定义一个数组,里面存着number
下面的需要多练练,熟才能生巧:
- format()将本地参数转为特定格式,这个需要多练练,才能灵活运用
- x.XXX()字符串的一些方法
- Python可以将字符串当做字符数组来处理,比如遍历 for c in x;又比如x[3],还有切片功能用来截取字符串
- len(),sorted()等等方法