zoukankan      html  css  js  c++  java
  • python学习笔记

    学习《Python编程从入门到实践》摘记

    1. 列表:

    用方括号 [ ] 来表示列表, 并用逗号来分隔其中的元素。创建空列表empty_list = []

    利用print()打印列表内容, 包括方括号。利用方括号索引(from 0)访问元素之,而不包括方括号和引号。

    列表是动态的,列表创建后,可随着程序的运行增删元素。成员函数append(elem)在列表末尾添加元素;成员函数insert
    (idx, elem)在列表任何位置添加新元素;已知待删除元素的索引时,可使用全局语句del list_name[idx] 删除指定元素。成员函数pop()删除列表末尾元素。成员函数pop(idx)带索引参数删除指定的元素。至于使用del语句还是pop()成员函数,一个简单的判断标准是 如果要从列表中删除一个元素,且不再以任何方式使用它,就使用del语句; 如果要在删除元素后还能继续使用它,就使用方法pop()成员函数。如果不知道要删除元素在列表中的位置,可使用成员函数remove(elem)删除第一个指定为elem的元素,所以如果别表中药有个该值时,也只能删除第一个等于改值的元素。

    当列表中元素类型统一为str类型时,成员函数sort(reverse = False)可以按字母顺序永久排序列表元素,当参数reverse = True可以按字母逆序永久排序列表元素,或者直接使用成员函数reverse()实现永久逆序排序。全局函数sorted(list_name)可不改list_name列表原始内容顺序的情况下给出排序后的列表内容,同样该全局函数也有reverse参数。

    使用全局函数len(list_name)可快速获取列表中元素个数。

    利用for elem in list_name: 遍历列表中元素。

    全局函数range(start, end, step)可用于生成一系列数字。for value in range(1,5): print(value)。将全局函数range(start, end)作为list()的参数,可以创建一个数字列表: list(range(1,6))      Out[49]: [1, 2, 3, 4, 5]; 全局函数range()可以指定步长,默认为1。In [50]: list(range(2,11,2))      Out[50]: [2, 4, 6, 8, 10]

    利用全局函数min(list_name),max(list_name)和sum(list_name)可以对数字列表执行简单的统计计算。

    列表解析 将for 循环和创建新元素的代码合并成一行, 并自动附加新元素。squares = [value**2 for value in range(1,11)]; 注意此处的for循环结尾处没有冒号。

    切片能力可生成任何列表的子集列表list_name[start_idx, end_idx],截取start_idx至end_idx-1直接的所有元素组成新的子列表。可用同时省略起始索引和终止索引[:]实现列表复制。
     

    2.元组

    列表非常适合用于存储在程序运行期间可能变化的数据集。 列表是可以修改的。然而, 有时候你需要创建一系列不可修
    改的元素, 元组可以满足这种需求。 Python将不能修改的值称为不可变的 , 而不可变的列表被称为元组 。

    元组看起来犹如列表, 但使用圆括号而不是方括号来标识。 定义元组后, 就可以使用索引来访问其元素, 就像访问列表元素一样,也使用方括号[]。

    像列表一样, 也可以使用for 循环来遍历元组中的所有值:
     

    3. 字典

    字典 是一系列键—值对 。 每个键 都与一个值相关联, 你可以使用键来访问与之相关联的值。 与键相关联的值可以是数字、 字符串、 列表乃至字典。 事实上, 可将任何Python对象用作字典中的值。字典用放在花括号{} 中的一系列键—值对表示,键和值之间用冒号分隔,而键—值对之间用逗号分隔alien_0 = {'color': 'green', 'points': 5}, 定义空字典dict_empty = {}
    通过键访问字典中的值:print(alien_0['color'])
    字典是一种动态结构, 可随时在其中添加键—值对。Python不关心键—值对的添加顺序, 而只关心键和值之间的关联关系。

    In [19]: alien_0 = {'color': 'green', 'points': 5}
    In [20]: alien_0
    Out[20]: {'color': 'green', 'points': 5}
    In [21]: alien_0['x_position'] = 0; alien_0['y_position'] = 25
    In [22]: print(alien_0)
    {'color': 'green', 'points': 5, 'x_position': 0, 'y_position': 25}
    对于字典中不再需要的信息, 可使用全局del语句将相应的键—值对彻底删除。使用del语句时, 必须指定字典名和要删除的键。

    In [1]: alien_0 = {'color': 'green', 'points': 5}; print(alien_0)
    {'color': 'green', 'points': 5}
    In [3]: del alien_0['color']; print(alien_0)
    {'points': 5}
    利用for循环和字典成员函数items()遍历字典。注意:便遍历字典时,键—值对的返回顺序也与存储顺序不同。Python不关心键—值对的存储顺序, 而只跟踪键和值之间的关联关系。

    In [6]: user_0 = {
    ...: 'username': 'efermi',
    ...: 'first': 'enrico',
    ...: 'last': 'fermi',
    ...: }

    In [7]: for key, value in user_0.items():
    ...: print(" Key: " + key)
    ...: print(" Value: " + value)
    在不需要使用字典中的值时,成员函数keys()很有用,可直接遍历字典中的所有键。遍历字典时, 会默认遍历所有的键, 因此, 如果将上述代码中的for name in favorite_languages.keys(): 替换为for name in favorite_languages: 输出结果保持不变。成员函数keys()实际上返回了一个包含字典中所有键的列表。

    字典总是明确地记录键和值之间的关联关系, 但获取字典的元素时, 获取顺序是不可预测的。 这不是问题, 因为通常你想要的只是获取与键相关联的正确的值。要以特定的顺序返回元素, 一种办法是在for 循环中对返回的键进行排序。 为此, 可使用全局函数sorted() 来获得按特定顺序排列的键列表的副本:

    In [14]: favorite_languages = {
    ...: 'jen': 'python',
    ...: 'sarah': 'c',
    ...: 'edward': 'ruby',
    ...: 'phil': 'python',
    ...: }
    ...: for name in sorted(favorite_languages.keys()):
    ...: print(name.title() + ", thank you for taking the poll.")
    ...:
    Edward, thank you for taking the poll.
    Jen, thank you for taking the poll.
    Phil, thank you for taking the poll.
    Sarah, thank you for taking the poll.
    如仅需字典包含的值,可使用成员函数values()。类似于keys()成员函数,该values()成员函数同样返回一个列表值,而不包含任何键。

    for language in favorite_languages.values():
    print(language.title())
    这种做法提取字典中所有的值, 而没有考虑是否重复。 涉及的值很少时, 这也许不是问题, 但如果被调查者很多, 最终的列表可能包含大量的重复项。 为剔除重复项, 可使用集合(set) 。 集合 类似于列表, 但每个元素都必须是独一无二的:

    for language in set(favorite_languages.values()):
    print(language.title())
    4. 嵌套

    有时候, 需要将一系列字典存储在列表中, 或将列表作为值存储在字典中, 这称为嵌套。

    alien_0 = {'color': 'green', 'points': 5}
    alien_1 = {'color': 'yellow', 'points': 10}
    alien_2 = {'color': 'red', 'points': 15}
    aliens = [alien_0, alien_1, alien_2]
    for alien in aliens:
    print(alien)

    output:
    {'color': 'green', 'points': 5}
    {'color': 'yellow', 'points': 10}
    {'color': 'red', 'points': 15}
    动态创建和修改(利用切片实现局部修改)嵌套结构

    # 创建一个用于存储外星人的空列表
    aliens = []

    # 创建30个绿色的外星人
    for alien_number in range (0,30):
    new_alien = {'color': 'green', 'points': 5, 'speed': 'slow'}
    aliens.append(new_alien)

    for alien in aliens[0:3]:
    if alien['color'] == 'green':
    alien['color'] = 'yellow'
    alien['speed'] = 'medium'
    alien['points'] = 10

    # 显示前五个外星人
    for alien in aliens[0:5]:
    print(alien)
    print("...")
    在字典中存储列表

    favorite_languages = {
    'jen': ['python', 'ruby'],
    'sarah': ['c'],
    'edward': ['ruby', 'go'],
    'phil': ['python', 'haskell'],
    }
    for name, languages in favorite_languages.items():
    print(" " + name.title() + "'s favorite languages are:")
    for language in languages:
    print(" " + language.title())
    5. 函数

    用关键字def来定义函数,

    #函数定义
    def greet_user(username):
    """显示简单的问候语"""
    print("Hello, " + username.title() + "!")

    # 函数调用
    greet_user('jesse')
    当函数定义中包含多个形参时,函数调用的方式可使用位置实参 , 这要求实参的顺序与形参的顺序相同; 也可使用关键
    字实参 , 其中每个实参都由变量名和值组成; 还可使用列表和字典。

    def describe_pet(animal_type, pet_name):
    """显示宠物的信息"""
    print(" I have a " + animal_type + ".")
    print("My " + animal_type + "'s name is " + pet_name.title() + ".")


    # 位置实参调用方式, 实参位置顺序很重要
    describe_pet('dog', 'peter')

    # 关键字实参调用方式,直接将实参和函数定义中的形参关联
    # 关键字实参让你无需考虑函数调用中的实参顺序, 还清楚地指出了函数调用中各个值的用途
    describe_pet(animal_type='cat', pet_name='lili')
    # 或者
    describe_pet(pet_name='lili', animal_type='cat')
    编写函数时, 可给每个形参指定默认值 。 在调用函数中给形参提供了实参时, Python将使用指定的实参值; 否则, 将使用形参的默认值。

    def describe_pet(pet_name, animal_type='dog'):
    """显示宠物的信息"""
    print(" I have a " + animal_type + ".")
    print("My " + animal_type + "'s name is " + pet_name.title() + ".")

    describe_pet(pet_name='willie')
    #或
    describe_pet('willie')
    在函数中, 可使用return 语句将值返回到调用函数的代码行。将程序的大部分繁重工作移到函数中去完成, 从而简化主程序。

    def get_formatted_name(first_name, last_name, middle_name=''):
    """返回整洁的姓名"""
    # Python将非空字符串解读为True
    if middle_name:
    full_name = first_name + ' ' + middle_name + ' ' + last_name
    else:
    return full_name.title()

    musician = get_formatted_name('jimi', 'hendrix')
    print(musician)

    musician = get_formatted_name('john', 'hooker', 'lee')
    print(musician)
    函数可返回任何类型的值, 包括列表和字典等较复杂的数据结构。

    def build_person(first_name, last_name, age=''):
    """返回一个字典, 其中包含有关一个人的信息"""
    person = {'first': first_name, 'last': last_name}
    if age:
    person['age'] = age
    return person

    musician = build_person('jimi', 'hendrix')
    print(musician)
    列表变量作为函数形参。

    def greet_users(names):
    """向列表中的每位用户都发出简单的问候"""
    for name in names:
    msg = "Hello, " + name.title() + "!"
    print(msg)

    usernames = ['hannah', 'ty', 'margot']
    greet_users(usernames)
    将列表传递给函数后,函数就可对其进行修改,在函数中对这个列表所做的任何修改都是永久性的。

    def print_models(unprinted_designs, completed_models):
    """模拟打印每个设计, 直到没有未打印的设计为止打印每个设计后, 都将其移到列表completed_models中"""
    while unprinted_designs:
    current_design = unprinted_designs.pop()
    # 模拟根据设计制作3D打印模型的过程
    print("Printing model: " + current_design)
    completed_models.append(current_design)


    def show_completed_models(completed_models):
    """显示打印好的所有模型"""
    print(" The following models have been printed:")
    for completed_model in completed_models:
    print(completed_model)

    unprinted_designs = ['iphone case', 'robot pendant', 'dodecahedron']
    completed_models = []

    print_models(unprinted_designs, completed_models)
    show_completed_models(completed_models)
    但是,有时为了避免在函数内的修改影响到实参列表变量(即永久性修改问题),可向函数传递列表的副本而不是原件;这样函数所做的任何修改都只影响副本, 而丝毫不影响原件。

    # 切片表示法[:]创建列表的副本
    function_name(list_name[:])
    虽然向函数传递列表的副本可保留原始列表的内容, 但除非有充分的理由需要传递副本, 否则还是应该将原始列表传递给函数, 因为让函数使用现成列表可避免花时间和内存创
    建副本, 从而提高效率, 在处理大型列表时尤其如此。

    在函数定义时,利用星号*标注形参的方式来实现传递任意数量的实参。注意, Python将实参封装到一个元组中, 即便函数只收到一个值也如此。

    # 形参*tops的星号让Python创建一个名为tops的空元组,并将收到的所有值都封装到这个元组中。
    def make_pizza(size, *tops):
    """概述要制作的比萨"""
    print(" Making a " + str(size) + "-inch pizza with the following tos:")
    # 查看形参
    print(tops)
    for topping in tops:
    print("- " + topping)

    make_pizza(16, 'pepperoni')
    make_pizza(12, 'mushrooms', 'green peppers', 'extra cheese')
    在函数定义时,利用两个星号(**)标注形参的方式来实现任意数量的关键字实参。注意,函数调用需要以“键—值对”形式。

    # 形参**user_info中的两个星号让Python创建一个名为user_info 的空字典, 并将收到的所有名称—值对都封装到这个字典中。
    def build_profile(first, last, **user_info):
    """创建一个字典, 其中包含我们知道的有关用户的一切"""
    profile = {}
    profile['first_name'] = first
    profile['last_name'] = last
    for key, value in user_info.items():
    profile[key] = value
    return profile

    user_profile = build_profile('albert', 'einstein', location='princeton', field='physics')
    print(user_profile)
    模块

    将函数存储在被成为模块的独立文件中,可将代码块和主程序分离,通过给函数调用,让主程序清晰、易于理解。通过import语句将模块导入到主程序中,实现运行在当前程序文件中使用模块中的代码块。通过将函数存储在独立的文件中, 可隐藏程序代码的细节, 将重点放在程序的高层逻辑上。同时易于代码的重用和共享。导入方法: 只需编写一条import 语句并在其中指定模块名,就可在程序中使用该模块中的所有函数。 如果你使用这种import 语句导入了名为module_name.py的整个模块, 就可使用下面的语法来使用其中任何一个函数:

    # Python会在幕后将该模块中的所有函数都复制到这个程序中
    import module_name
    module_name.function_name()
    另一种导入方式:导入模块中的特定函数,此种方式导入特定函数后,直接使用函数名的方式function_name()调用函数即可,无需module.function_name()的调用方式。

    from module_name import function_name
    # 通过用逗号分隔函数名, 可根据需要从模块中导入任意数量的函数
    from module_name import function_0, function_1, function_2
    如果导入的函数的名称可能与程序中现有的名称冲突,或函数名太长,可在导入的同时给函数起别名。

    from module import function_name as func_name
    #通过别名调用函数
    func_name()
    还可以给模块起别名。通过给模块指定简短的别名(如给模块pizza 指定别名p ), 方便后续调用模块中的函数。

    import module_name as mn
    mm.fun()
    使用星号(* ) 运算符可让Python导入模块中的所有函数, 这样在调用模块中的具体代码时就无需module.function_name()的形式了,可直接使用function_name()的调用方式。注意,这种方式容易引起冲突。

    from module_name import *
    fun()

    类的定义和函数定义类似,不过使用class关键字,而不是def关键字,在类命后同样需要有一个括号和一个冒号():。类成员函数的定义参数列表中的第一个参数必须时self。self参数实现将根据类创建的实例的属性和形参。

    # 定义类
    class Dog():
    '''一次模拟小狗的简单尝试'''
    # 在创建实例对象时,python会自动调用该函数
    def __init__(self, name, age):
    '''初始化属性name和age'''
    self.name = name
    self.age = age

    def sit(self):
    print(self.name.title() + "is now sitting.")

    def roll_over(self):
    '''模拟小狗被命令时蹲下'''
    print(self.name.title() + "rolled over!")


    #创建和使用实例
    my_dog = Dog('willie', 6)
    my_dog.sit()
    my_dog.roll_over()
    print("My dog's name is " + my_dog.name.title() + ".")
    print("My dog is " + str(my_dog.age) + " years old.")
    类中的每个属性都必须有初始值, 哪怕这个值是0或空字符串。 在有些情况下,如设置默认值时,在方法__init__()内指定这种初始值是可行的;如果你对某个属性这样做了,就无需包含为它提供初始值的形参。

    修改实例对象属性值:直接修改属性值 实例对象名.属性命=新值; 通过成员函数修改属性的值。

    一个类继承另一个类时,它将自动获得另一个类的所有属性和方法;原有的类称为父类 ,而新类称为子类。子类继承了其父类的所有属性和方法,同时还可以定义自己的属性和方法。创建子类的实例时,Python首先需要完成的任务是给父类的所有属性赋值。 为此,子类的方法__init__() 需要父类施以援手。

    # 在括号中指定父类
    class Chinadog(Dog):
    """通过类继承定义特定狗的独特之处"""
    def __init__(self, name, age, year):
    super().__init__(name, age)
    self.year = year

    def get_descriptive_name(self):
    desc = self.name.title() + ' ' + str(self.age) + ' ' + str(self.year)
    print(desc)

    your_dog = Chinadog('tesla', 3, 2014)
    your_dog.get_descriptive_name()
    对于父类的方法, 只要它不符合子类模拟的实物的行为, 都可对其进行重写。

    在同一个独立模块(*.py文件)中,可以根据需要存储任意数量的类。在使用的时候可以具体到处相应的类,例如:

    from car import Car, ElectricCar
    需要从一个模块中导入很多类时, 最好导入整个模块, 并使用 module_name.class_name 语法来访问类。
     

    Python标准库

    Python标准库 是一组模块, 安装的Python都包含它。使用标准库中的任何函数和类,只需在程序开头包含一条简单的import 语句。例如下面演示使用collections模块 中的一个类——OrderedDict,该类可以记录“键-值对”的添加顺序,其他几乎与普通的字典{}相同。

    from collections import OrderedDict

    favorite_languages = OrderedDict()
    favorite_languages['jen'] = 'python'
    favorite_languages['sarah'] = 'c'
    favorite_languages['edward'] = 'ruby'
    favorite_languages['phil'] = 'python'

    for name, language in favorite_languages.items():
    print(name.title() + " 's favorite language is " + language.title() + ".")
    模块random 包含以各种方式生成随机数的函数, 其中的randint() 返回一个位于指定范围内的整数

    # 返回一个1~6内的整数
    from random import randint
    x = randint(1,6)
    类名应采用驼峰命名法 , 即将类名中的每个单词的首字母都大写, 而不使用下划线。 实例名和模块名都采用小写格式, 并在单词之间加上下划线。对于每个类, 都应紧跟在类定义后面包含一个文档字符串, 简要描述类的功能。每个模块也都应包含一个文档字符串, 对其中的类可用于做什么进行描述。在类中, 可使用一个空行来分隔方法; 而在模块中, 可使用两个空行来分隔类。先编写导入标准库模块的import 语句, 再添加一个空行, 然后编写导入你自己编写的模块的import 语句。

    文件
    可以一次性读取文件的全部内容,也可以以每次一行的方式逐步读取。

    # 一次性读取全部内容
    with open('pi_digits.txt') as file_object:
    contents = file_object.read() # python会读取文件中全部内容,并自动在末尾加
    print(contents.rstrip())

    filename = 'pi_digits.txt'
    with open(filename) as file_object:
    for line in file_object:
    print(line)
    也可以通过列表的方式将文件内容按行存储在列表中。

    with open(filename) as file_object:
    lines = file_object.readlines() # 按行读取文件中的每一行,并存储在列表中。

    for line in lines:
    print(line.rstrip())
    要将文本写入文件, 你在调用open() 时需要提供另一个实参, 告诉Python你要写入打开的文件。注意:Python只能将字符串写入文本文件。 要将数值数据存储到文本文件中, 必须先使用函数str() 将其转换为字符串格式。


    异常

    python使用一种被称为异常的特殊对象来管理程序执行期间发生的错误。每当发生让Python不知所措的错误时,它都会创建一个异常对象。如果你编写了处理该异常的代码,程序将继续运行;如果你未对异常进行处理,程序将停止,并显示一个traceback, 其中包含有关异常的报告。

    异常是使用try-except 代码块处理的。try-except 代码块让Python执行指定的操作, 同时告诉Python发生异常时怎么办。使用了try-except代码块时,即便出现异常,程序也将继续运行,显示你编写的友好的错误消息,而不是令用户迷惑的traceback。

    print("Give me two numbers, and I'll divide them.")
    print("Enter 'q' to quit.")

    while True:
    first_number = input(" First number: ")
    if first_number == 'q':
    break
    second_number = input("Second number: ")
    try:
    answer = int(first_number) / int(second_number)
    except ZeroDivisionError: # ZeroDivisionError异常对象
    print("You can't divide by 0!")
    else:
    print(answer)
    try-except-else 代码块的工作原理大致如下: Python尝试执行try 代码块中的代码; 只有可能引发异常的代码才需要放在try 语句中。有时候,有一些仅在try代码块成功执行时才需要运行的代码;这些代码应放在else代码块中。except代码块告诉Python, 如果它尝试运行try 代码块中的代码时引发了指定的异常,该怎么办。
    处理FileNotFoundError异常

    filename = 'alice.txt'
    try:
    with open(filename) as f_obj:
    contents = f_obj.read()
    except FileNotFoundError:
    msg = "Sorry, the file " + filename + " does not exist."
    print(msg)
    文本分析

    str的成员函数split() 以空格为分隔符将字符串分拆成多个部分, 并将这些部分都存储到一个列表中。

    title = "Alice in Wonderland"
    title.split()
    Out[42]: ['Alice', 'in', 'Wonderland']
    让程序在失败时一声不吭,可像通常那样编写try 代码块,但在except 代码块中明确地告诉Python什么都不要做。Python有一个pass 语句,可在代码块中使用它来让Python什么都不要做。

    try:
    # do something
    except FileNotFoundError:
    pass
    else:
    # if no any exception do thess things.

    可以使用str的成员函数count() 来确定特定的单词或短语在字符串中出现了多少次。

    line = "Row, row, row your boat"
    line.count('row')
    Out[43]: 2
    存储数据

    一种简单的方式是使用模块json 来存储数据。注意:JSON(JavaScript Object Notation) 格式最初是为JavaScript开发的,但随后成了一种常见格式,被包括Python在内的众多语言采用。使用json.dump() 来存储数据;使用json.dump()加载数据。

    import json

    numbers = [2, 3, 5, 7, 11, 13]
    filename = 'numbers.json'

    # 演示存储数据
    with open(filename, 'w') as f_obj:
    json.dump(numbers, f_obj)

    # 演示加载数据
    with open(filename) as f_obj:
    nn = json.load(f_obj)
    print(nn)
    测试
    Python标准库中的模块unittest 提供了代码测试工具。要为函数编写测试用例, 可先导入模块unittest 以及要测试的函
    数, 再创建一个继承unittest.TestCase 的类, 并编写一系列方法对函数行为的不同方面进行测试。方法名必须以test_打头,
    这些方法由Python自动调用, 无需编写调用它们的代码。

    import unittest
    from name_function import get_formatted_name
    class NamesTestCase(unittest.TestCase):
    """测试name_function.py"""

    # 方法名必须以test_打头
    def test_first_last_name(self):
    """能够正确地处理像Janis Joplin这样的姓名吗? """
    formatted_name = get_formatted_name('janis', 'joplin')

    #利用断言方法用来核实得到的结果是否与期望的结果一致
    self.assertEqual(formatted_name, 'Janis Joplin')

    # 方法名必须以test_打头
    def test_first_last_middle_name(self):
    """能够正确地处理像Wolfgang Amadeus Mozart这样的姓名吗? """
    formatted_name = get_formatted_name('wolfgang', 'mozart', 'amadeus')
    self.assertEqual(formatted_name, 'Wolfgang Amadeus Mozart')


    # 所有以test打头的方法都将自动运行
    unittest.main()
    除了可以编写针对单个函数的测试,还可以编写针对类的测试。Python在unittest.TestCase 类中提供了很多断言方法。
     

    unittest Module中的断言方法
    方法 用途
    assertEqual(a, b) 核实 a == b
    assertNotEqual(a, b) 核实a != b
    assertTrue(x) 核实x 为True
    assertFalse(x) 核实x 为False
    assertIn(item , list ) 核实 item 在 list 中
    assertNotIn(item , list ) 核实 item 不在 list 中
    类的测试与函数的测试相似——所需要做的大部分工作都是测试类中方法的行为,但存在一些不同之处。unittest.TestCase 类包含方法setUp() , 让我们只需创建这些对象一次, 并在每个测试方法中使用它们。 如果你在TestCase 类中包含了方法setUp() , Python将先运行它, 再运行各个以test_打头的方法。 这样, 在你编写的每个测试方法中都可使用在方法setUp() 中创建的对象了。
     

    import unittest
    from survey import AnonymousSurvey

    class TestAnonymousSurvey(unittest.TestCase):
    """针对AnonymousSurvey类的测试"""

    def setUp(self):
    """创建一个调查对象和一组答案, 供使用的测试方法使用"""
    question = "What language did you first learn to speak?"
    self.my_survey = AnonymousSurvey(question)
    self.responses = ['English', 'Spanish', 'Mandarin']

    def test_store_single_response(self):
    """测试单个答案会被妥善地存储"""
    self.my_survey.store_response(self.responses[0])
    self.assertIn(self.responses[0], self.my_survey.responses)

    def test_store_three_responses(self):
    """测试三个答案会被妥善地存储"""
    for response in self.responses:
    self.my_survey.store_response(response)

    for response in self.responses:
    self.assertIn(response, self.my_survey.responses)

    unittest.main()
    外星人入侵游戏开发案例

    在conda中安装pygame的指令: pip install pygame

    数据可视化

    利用plot()绘制简单折线,

    import matplotlib.pyplot as plt

    input_values = [x for x in range(1,6)]
    squares=[x**2 for x in input_values]

    plt.plot(input_values, squares, linewidth=5)
    # 设置图表标题, 并给坐标轴加上标签
    plt.title("Square Numbers", fontsize=24)
    plt.xlabel("Value", fontsize=14)
    plt.xlabel("Square of Value", fontsize=14)
    # 设置刻度标记的大小
    plt.tick_params(axis='both', labelsize=14)

    plt.show()
    利用scatter()绘制离散点,matplotlib允许指定散点图中的各个点颜色。默认为蓝色点和黑色轮廓,在散点图包含的数据点不多时效果很好。但绘制很多点时,黑色轮廓可能会粘连在一起。要删除数据点的轮廓,可在调用scatter()时传递实参edgecolor='none' ,要修改数据点的颜色,可向scatter() 传递参数c ,并将其设置为要使用的颜色的名称,c='red' 或c=(1.0, 0.0, 0.0);

    使用颜色映射, 颜色映射 (colormap) 是一系列颜色, 它们从起始颜色渐变到结束颜色。模块pyplot 内置了一组颜色映射。 要使用这些颜色映射, 你需要告诉pyplot 该如何设置数据集中每个点的颜色。 下面演示了如何根据每个点的 y 值来设置其颜色:

    plt.scatter(x_values, y_values, c=y_values, cmap=plt.cm.Blues, edgecolor='none', s=40)
    自动保存图表,要让程序自动将图表保存到文件中, 可将对plt.show() 的调用替换为对plt.savefig() 的调用:
    plt.savefig('squares_plot.png', bbox_inches='tight')

    plt.savefig('squares_plot.png', bbox_inches='tight')


    随机漫步

    """File: random_walk.py, 生成随机漫步数据"""
    from random import choice

    class RandomWalk():
    """一个生成随机漫步数据的类"""

    def __init__(self, num_points=5000):
    """初始化随机漫步的属性"""
    self.num_points = num_points

    # 所有随机漫步都始于(0,0)
    self.x_value = [0]
    self.y_value = [0]

    def fill_walk(self):
    """计算随机漫步包含的所有点"""

    # 不断漫步,直到列表达到指定的长度
    while len(self.x_value) < self.num_points:
    # 决定前进方向以及沿这个方向前进的距离
    x_direction = choice([1, -1])
    x_distance = choice([0, 1, 2, 3, 4])
    x_step = x_direction * x_distance

    y_direction = choice([1, -1])
    y_distance = choice([0, 1, 2, 3, 4])
    y_step = y_direction * y_distance

    # 拒绝原地踏步
    if x_step == 0 and y_step == 0:
    continue

    # 计算下一个点的x和y值
    next_x = self.x_value[-1] + x_step
    next_y = self.y_value[-1] + y_step

    self.x_value.append(next_x)
    self.y_value.append(next_y)


    """File: rw_visual.py, 绘制随机漫步图"""
    import matplotlib.pyplot as plt
    from random_walk import RandomWalk

    # 只要程序处理活动状态,就不断地模拟随机漫步
    while True:
    # 创建一个RandomWalk实例,并将其包含的点都绘制出来
    rw = RandomWalk()
    rw.fill_walk()

    # 设置绘图窗口的尺寸
    plt.figure(figsize=(15, 9))

    point_num = list(range(rw.num_points))
    plt.scatter(rw.x_value, rw.y_value, c=point_num, edgecolor='none',
    cmap=plt.cm.Blues, s=15)

    # 突显起点和终点
    plt.scatter(0, 0, c='green', edgecolors='none', s=100)
    plt.scatter(rw.x_value[-1], rw.y_value[-1], c='red', edgecolors='none',
    s=100)

    # 隐藏坐标轴
    #frame = plt.gca()
    #frame.axes.get_xaxis().set_visible(False)
    #frame.axes.get_yaxis().set_visible(False)
    # 关闭坐标刻度
    plt.xticks([])
    plt.yticks([])
    # 关闭坐标轴
    plt.axis('off')

    plt.show()

    keep_running = input("Make another walk? (y/n): ")
    if keep_running == 'n':
    break
     

    模拟掷骰子
    使用Python可视化包Pygal可生成具有缩放能力的矢量图形文件。对于以在线方式展示的图表,请考虑使用Pygal,使其图表在任何设备上显示时都会很美观。
     

    enumerate使用

    animals = ['cat', 'dog', 'monkey']
    for idx, animal in enumerate(animals):
    print('#%d: %s' % (idx + 1, animal))

    ---------------------
    作者:noon1252
    来源:CSDN
    原文:https://blog.csdn.net/noon1252/article/details/82941015
    版权声明:本文为博主原创文章,转载请附上博文链接!

  • 相关阅读:
    Apollo的Oracle适配改动
    尝试Java,从入门到Kotlin(下)
    尝试Java,从入门到Kotlin(上)
    RabbitMQ权限控制原理
    一文彻底掌握二叉查找树(多组动图)(史上最全总结)
    图解:深度优先搜索与广度优先搜索及其六大应用
    图解:如何理解与实现散列表
    图解:什么是“图”?
    查找算法系列文(一)一文入门二叉树
    线性表(数组、链表、队列、栈)详细总结
  • 原文地址:https://www.cnblogs.com/python-cat/p/11052121.html
Copyright © 2011-2022 走看看