两周学会Python 第01天(上午)

程序源码下载:
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("&","&amp;")
    text = text.replace("<","&lt;")
    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()

小结

  1. abs(x) < sys.float_info.epsilon 判断x是否是0
  2. float(x) 将x转为float类型,类似有: int(x),hex(x),bin(x)等等
  3. print(“ax\N{SUPERSCRIPT TWO} + bx + c = 0”)特殊字符表示\N{…}
  4. b ** 2 计算b的平方,m ** n即m的n次方,如2 ** (1/2)等于2的平方根,注意负数哦!!!
  5. math.sqrt(x) x平方根 同理cmath.sqrt(x)复数级别的平方根
  6. fields.append(field)数组添加元素
  7. 定义5个常量ID,FORENAME,MIDDLENAME,SURNAME,DEPARTMENT = range(5)
  8. User = collections.namedtuple(“User”,”username forename middlename surname id”)定义User类
  9. users[(user.surname.lower(),user.forename.lower(),user.id)] = user相当于java的map,左边 集合名称[key] = value
  10. 定义集合users = {}
  11. “,”.join([“{0:.2f}”.format(m) for m in statistics.mode]) ,遍历statistics.mode,将每条结果通过”,”连接.
  12. mode = [number for number,frequency in frequencies.items()
    if frequency == hightest_frequency] 定义一个数组,里面存着number

下面的需要多练练,熟才能生巧:

  1. format()将本地参数转为特定格式,这个需要多练练,才能灵活运用
  2. x.XXX()字符串的一些方法
  3. Python可以将字符串当做字符数组来处理,比如遍历 for c in x;又比如x[3],还有切片功能用来截取字符串
  4. len(),sorted()等等方法
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值