[Python日记-3] input-while循环-函数-类

  今天学的就没有昨天痛苦,上升了一个高度,重新了解了面向对象编程。刚接触的时候正好是面向对象这个概念刚兴起的时候,当时觉得也不过如此,没想到站这么快。世界之快,不过白驹过隙。抓住发展的尾巴,upup。


 

1. 用户输入

  input(“String”),作用是向显示器输出String,并获取用户输入,保存为字符串。  #(Python2.7中:raw_input())

  int(),用以将数字的字符串表示转换为数值表示,便于计算与比较。

  %,求模运算符,将两个数相除并返回余数。常用来计算奇偶数,也用来控制循环。

 


 

2. while循环

  for循环用于针对集合中的每一个元素的代码块,而while循环不断地运行,直到指定条件不满足为止。

  while语句中只需检查标志的当前值是否为True,并将所有测试(包括将标志设置为False的事件)都放在其他地方,从而让程序变得更为简洁。

  

  2.1. 循环中的控制语句

    break:立刻退出任何循环,不再运行循环中余下的代码。

    continue:返回循环开头,并根据条件测试结果决定是否继续执行。

  2.2. while循环的功能

    2.2.1 在列表之间移动元素

    2.2.2 删除包含特定值的所有列表元素

    2.2.3 使用用户输入来填充字典

#验证每个用户,并将经过验证的列表移到已验证列表中,直到没有未验证用户为止。
while unconfirmed_users:
    current_user = unconfirmed_users.pop()
    print("Verifying user:"+current_user.title())
    confirmed_users.append(current_user)

#删除列表中的特定元素
while "cat" in pets:
    pets.remove("cat")

#设置一个标志,指出用户输入是否继续
responses = {}
polling_active = True
while polling_active:
    name = input("your name?")
    response = input("your response?")
    responses[name] = response
#询问是否继续
    repeat = imput("continue?(y/n)")
    if repeat == 'n':
        polling_active = False
#skip

 


3. 函数

def func(val):
    """函数注解"""
    run_code
    return n

  其中的函数注解被称为文档字符串(docstring)的部分,描述函数是做什么的。文档字符串用三引号括起,Python使用它们来生成有关程序中函数的文档。

  上述代码中的定义的函数func包括形参val,和返回值n,这些都是可选的,并非必要。

  

  鉴于函数定义时可能包括多个形参,因此函数调用中也可能包含多个实参,向函数传递实参的方式有很多。

    1. 位置实参:要求实参与形参顺序相同。

    2. 关键字实参:其中每个实参都有变量名和值组成,还可以使用列表和字典。

    3. 同时可以在函数定义语句中,给形参设定默认值,这样没有获得实参传递的形参会使用默认值进行运算。

#关键词实参传递
#与顺序无关,且等号两边无空格
describe_pet(animal_type='hamster', pet='harry')

#给形参设定默认值
def describe_pet(pet_name, animal_type='dog'):

 

  其中函数接收实参的类型有很多,可以是数字,字符,列表,元组,字典等等复合形式。

  在传递列表时,如要禁止函数所做的任何修改影响列表本身,可以将列表的副本传递给函数,如下:

#切片表示法[:]创建列表副本
function_name(list_name[:])

 

  函数可返回任何类型的值,包括列表和字典等较复杂的数据结构。

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

 

  传递任意数量的实参

  • *val_name让Python创建一个名为val_name的空数组,并将所有收到的值都封装到这个元组中。
  • **user_info是的Python创建一个空字典,并将收到的所有“键-值对”都封装到这个字典中。在这个函数中,可以像访问其他字典那样访问user_info中的键-值对。

  注意:

  如果要让函数接收不同类型的实参,必须在函数定义中将接纳任意数量实参的形参放在最后。Python先匹配位置实参和关键字实参,再将剩下的实参收集到最户一个形参中。

 

  将函数储存在模块中

  通过将函数存储在独立的文件中(.py),可隐藏程序代码的细节,将重点放在程序的高层逻辑上。还可以提高函数的重用。同时,将函数存储在独立文件中后,可与其他程序员共享这些文件而不是整个程序。

  要让函数是可导入的,得首先创建模块。模块式扩展名为.py的文件,包含要导入到程序中的代码。即将def函数定义保存到外部独立的py文件。

  

  函数导入方法:

  

from module import *
from module import funcotion
from module import function as func

import module as mod
from module import func0, func1, func2

#将函数和数据整洁的封装起来,让你能灵活高效地使用它们

 


 

4. 类

  面向对象编程,类定义了一大类对象都有的通用行为。基于类创建对象被称为实例化,面向对象,面向现实世界。有点A/D转换的意思。

  建立个Dog类

class Dog():
    """一次模拟小狗的简单demo"""
    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 pver!")

  __init__()定义中包含三个形参:self、name、age。形参self必不可少,还必须位于其他形参的前面。因为Python调用__init__()这个方法来创建Dog实例时,将自动传入实参self。每个与类相关联的方法调用都自动传递实参self,它是一个指向实例本身的引用,让实例能够访问类中的属性和方法。

  我们创建Dog实例时,Python会调用Dog类的方法__init__()。我们将通过实参向Dog()传递名字和年龄,self会自动传递,因此我们不需要传递它。每当我们根据Dog类创建实例时,都只需给最后两个形参(name,age)提供值。

 

  可以给属性指定默认值,来提高对象的丰富度。

  同时创建实例后,尽量不要直接显式修改某属性的值,通过方法来实现对值的修改和递增操作。

class Car():
    --skip--
    def update_odometer(self, mileage):
        """
        将里程表读数设置为指定的值
        禁止将里程表读数往回调
        """
        if mileage >= self.odometer_reading:   
            self.odometer_reading = mileage
        else:
            print("You can't roll back an odometer!")

 

继承

  一个类继承另一个类时,它将自动获得另一个类的所有属性和方法;原有的类称为父类。新类称为子类。子类继承了其父类的所有属性和方法,同时可以定义自己的属性和方法。

class Car():
    --skip--
class ElectricCar(Car):
    """电动汽车的独特之处"""
    def __init__(self, make, model, year):
        """初始化父类的属性"""
        super().__init__(make, model, year)

  super()是一个特殊的函数,帮助Python将父类和子类关联起来。这行代让Python调用ElectricCar的父类的方法__init__(),让ElectricCar实例包含父类的所有属性。父类也称为超类(superclass)。

 

重写父类方法:

  在子类中定义与父类方法同名的方法,这样Python就不会考虑这个父类方法,而只关注于你在子类中定义的相应方法。

 

实例用作属性:

  即将一些属性和方法放到一个新的类中,包含在原始的类下,并且没有继承关系。

class Car():
    --snip--
class Battery():
    """模拟电动车电瓶"""
    def __init()__(self, battery_size=70):
        """初始化电瓶的属性"""
        self.battery_size = battery_size
    def describe_battery(self):
        """显示电瓶容量"""
        print("This car has a "+str(self.battey_size)+"-kWh battery.")

 

模拟实物:

  活用类会让你进入程序员的另一个境界:解决上述问题时,你从较高的逻辑层面(而不是语法层面)考虑;你考虑的不是Python,而是如何用代码来表示实物。到了这种境界后,你经常会发现,现实世界的建模方法没有对错之分。有些方法的效率更高,但要找出效率最高的表示法,需要经过一定的实践。

 

导入类:

  下面实例为一个汽车的实例:

"""一个可用于表示汽车的类"""

class Car():
    """一次模拟汽车的简单尝试"""
    def __init__(self, make, model, year):
        """初始化描述汽车的属性"""
        self.make = make
        self.model = model
        self.year = year
        self.odometer_reading = 0
    def get_descriptive_name(self):
        """返回整洁的描述性名称"""
        long_name = str(self.year)+' '+self.make+' '+self.model
        return long_name.title()
    def read_odometer(self, mileage):
        """
        将里程表读数设置为指定的值
        拒绝将里程表往回拨
        """
        if mileage >= self.odometer_reading:
            self.odometer_reading = mileage
        eles:
            print('You can't roll back an odometer!')
    def increment_odometer(self, miles):
        """将里程表读数增加指定的量"""
        self.odometer_reading+=miles

 

  类的导入类似函数和库文件的导入,同时支持类的定义中使用外部导入的别的类。


 

小结:

  今天学的很开心,花了两个多小时的时间来整理笔记,有点累,但也有收获。

  以后代码要在Pycharm中编写、运行,这blog的代码编辑器真的费眼。

 

posted @ 2020-02-08 17:22  viLogy  阅读(387)  评论(0编辑  收藏  举报