Python学习笔记(二)

一、用户输入和while循环

  • 函数input()的工作原理
messege = input('Please input something:')
print(messege)    # 函数input()接受一个参数,即要向用户显示的提示或说明,输入后按回车继续进行
    • 编写清晰的程序:可以把要向用户展示的信息先存在变量中
    • 使用int()来获取数值输入:input()将输入解读为字符串
>>>age = input('How old are you?')
How old are you? 21
>>>age
'21'    # 为字符串
>>>int(age)
21     # 转换为数值
    • 求模运算符(%):将两个数相除并返回余数(可以用这一点来判断一个数是奇数还是偶数)
>>>4 % 3
1
  • while循环简介
    • 使用while循环
number = 1
while number <= 5:      # 打印1~5数字
    print(number)
    number += 1
    • 让用户选择何时退出
# 方法一
prompt = '\nTell me something, and I will repeat it back to you:'
prompt += '\n Enter \'quit\' to end the program.'
message = ' '    # 空字符串
while message != 'quit':
    message = input(prompt)
    print(message)                  # 将单词'quit'打印出来了

# 方法二
message = ' '
while message != 'quit':
    message = input(prompt)

    if message != 'quit':           # 仅在消息不是‘quit’时才打印
        print(message)  
    • 使用标志:定义一个变量,用于判断整个程序是否处于活动状态
active = True
while active:
    message = input(prompt)

    if message == 'quit':
        active = False
    else:
        print(message)
    • 使用break退出循环
while True:
    messege = input(prompt)

    if message == 'quit':
        break
    else:
        print(message)
    • 在循环中使用continue
number = 0
while number < 10:
    number += 1
    if number % 2 == 0:      # 如果为偶数则继续循环
        continue

    print(number)                # 打印1~10中的奇数
    • 避免无限循环:如果程序陷入无限循环,可按Ctrl+C;也可关闭显示程序输出的终端窗口
  • 使用while循环来处理列表和字典(for循环能遍历列表,但不应该用来修改列表)
    • 在列表之间移动元素
# 将列表中的数字分配到奇数和偶数的列表中
numbers = [1, 2, 3, 4, 5]
odds = []
evens = []

while numbers:        # 当numbers列表为空时退出循环
    number = numbers.pop()
    if number % 2 == 0:
        evens.append(number)
    else:
        odds.append(number)
    • 删除包含特定值的所有列表元素
numbers = [1, 2, 1, 3, 1, 4]
while 1 in numbers:
    numbers.remove(1)
    • 使用用户输入来填充字典

二、函数

  • 定义函数
    • 使用关键字def,定义以冒号结尾,紧跟其后的所有缩进行构成函数体
def greet_user():
    """显示简单的问候语"""
    print('Hello!')

greet_user()
    • 向函数传递信息
    • 实参和形参
def greet_user(username):       # username为形参
    """显示简单的问候语"""
    print('Hello! ' + username + '.')

greet_user('mayyzym')            # mayyzym为实参
  • 传递实参
    • 位置实参:Python将按顺序将函数调用中的实参关联到函数定义中相应的形参
def people(name, age, gender):
    print(name + age + gender)

people('may', 21, 'female')
    • 关键字实参:传递给函数的是名称-值对,无需考虑函数调用中的实参顺序
people(name='may', gender='female', age=21)
    • 默认值:给每个形参指定默认值
def people(name, age, gender=‘female’):    # 使用默认值可以简化函数的调用 
    print(name + age + gender)

people('may', 21)
    • 等效的函数调用
def people(age, gender=‘female’):

# 一个21岁的女人
people(21)
people(age=21)

# 一个21岁的男人
people(21, 'male')
people(age=21, gender='male')
people(gender='male', age=21) 
  • 返回值
    • 返回简单值
def people(name):
    return name.title()
    • 让实参变成可选
def name(first_name, last_name, middle_name=' '):    # 让middle_name成为可选实参,Python将非空字符串解读为True
    """返回整洁的姓名"""
    if middle_name:
        full_name = first_name + ' ' + middle_name + ' ' + last_name
    else:
        full_name = first_name + ' ' + last_name
    return full_name.title()
    • 返回字典
    • 结合使用函数和while循环
  • 传递列表(即传递的参数为列表)
    • 在函数中修改列表
    • 禁止函数修改列表(可传递列表副本,使用切片[:])
  • 传递任意数量的实参
def people(*info):                # 形参*info中的一个型号让Python创建了一个名为info的空元组,将收到的所有值都封装到这个元组中
    """打印某个人的信息"""
    print(info)

people('may')
people('may', 21, 'female')
    • 结合使用位置实参和任意数量实参(python先匹配位置实参和关键字实参,再将余下的实参都收集到最后一个形参中)
    • 使用任意数量的关键字实参
def build_profile(first, last, **user_info):       # **user_info中的两个星号让python创建一个名为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('may', 'zheng', age=21, gender='female')
print(user_profile)

# 输出
{'first_name': 'may', 'last_name': 'zheng', 'age': '21', 'gender': 'female'}
  • 将函数存储在模块中
    • 导入整个模块
# module_name.py模块中有函数function_name()

import module_name    # 导入整个模块
module_name.function_name()    # 使用模块中的某个函数
    • 导入特定的函数
from module_name import function_name
from module_name import function_0, function_1, function_2    # 用逗号分隔函数名,使用这种语法时,调用函数时无需指定模块名
function_name()
    • 使用as给函数指定别名
from module_name import function_0 as f_0

f_0(a, b)
    • 使用as给模块指定别名
import module_name as mn

mn.function_0(a, b)
    • 导入模块中的所有函数
from module_name import *    # 调用函数时无需使用句点表示法,但是有时候会有名称相同的函数时会覆盖函数
  • 函数编写指南
    • 指定描述性名称,且只使用小写字母和下划线
    • 包含简要阐述其功能的注释,注释紧跟在函数定义后面,并采用文档字符串格式
    • 给形参指定默认值时,等号两边不要有空格
    • 所有的import语句应放在文件开头

三、类

  • 创建和使用类(面对对象编程)
    • 创建类
class Dog():                                   # 首字母大写的名称指的是类,类中括号是空的表示从空白创建这个类
    """一次模拟小狗的简单尝试"""

    def __init__(self, name, age):             # 方法__init__(),其中形参self必不可少且必须位于其他形参前面;类中的函数称为方法
        """初始化属性name和age"""
        self.name = name                       # 以self为前缀的变量都可供类中的所有方法是用,可通过实例访问的变量成为属性
        self.age = age

    def sit(self):
        """模拟小狗被命令时蹲下"""
        print(self.name.title() + " is now sitting.")

    def roll_over(self):
        """模拟小狗被命令时打滚"""
        print(self.name.title() + " rolled over!")
    • 根据类创建实例
      • Python使用实参调用类中的方法__init__(),该方法创建一个实例,虽然该方法并未显式地包含return语句,但是python自动返回一个实例。

class Dog(): --snip-- my_dog = Dog('willie', 6) # 用小写名称表示根据类创建的实例 print("My dog's name is " + my_dog.name.titile() + ".") print("My dog is " + str(my_dog.age) + " years old.")

      • 访问属性
my_dog.name
      • 调用方法
my_dog.roll_over()
  • 使用类和实例(可以直接修改实例的属性,也可以编写方法以特定的方式进行修改)
    • 给属性指定默认值
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):
        """打印一条指出汽车里程数的消息"""
        print("This car has " + str(self.odometer_reading) + " miles on it.")

my_new_car = Car('audi', 'a4', 2016)
print(my_new_car.get_discriptive_name())
my_new_car.read_odometer()
    • 修改属性的值
      • 直接修改属性的值(通过实例直接访问它)
my_new_car.odometer_reading = 23    # 直接修改属性的值
my_new_car.read_odometer()
      • 通过方法修改属性的值
class Car():
    --snip--
    
    def update_odometer(self, mileage):
        """将里程表读数设置为指定的值"""
        self.odometer_reading = mileage

my_new_car.update_odometer(23)
my_new_car.read_odometer()
      • 通过方法对属性的值进行递增
  • 继承(如果要编写的类是另一个现成类的特殊版本)
    • 一个类继承另一个类时,它将自动获取另一个类的所有属性和方法;父类(超类),子类
    • 子类的方法__init__()
# 创建子类时,父类必须包含在当前文件中,且位于子类的前面
class Car():
    --snip--

class ElectricCar(Car):
     """电动汽车的独特之处"""

    def __init__(self, make, model, year):
        """初始化父类的属性,再初始化电动汽车特有的属性"""
        super().__init__(make, model, year)        # super()是一个特殊函数,让子类调用父类的方法__init__()
        self.battery_size = 70


my_tesla = ElectricCar('tesla', 'model s', 2016)
print(my_tesla.get_decriptive_name())
    • 重写父类的方法(子类中定义的方法与父类方法同名)
    • 将实例用作属性
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.battery_size) + "-kWh battery.")


class ElectricCar(Car):
    
    def __init__(self, make, model, year):
        super().__init__(make, model, year)
        self.battery = Battery()


my_tesla.battery.describe_battery()
  • 导入类
    • 在一个模块中导入另一个模块等等
# 模块名car.py,模块包含Car类、ElectricCar类等

from car import Car                 # 导入单个类
from car import Car, ElectricCar    # 从一个模块中导入多个类
import car                          # 导入整个模块,使用语法module_name.class_name来访问需要的类
from module_name import *           # 导入模块中的所有类,不需要指定模块名称,但是有可能会覆盖原先文件已有的函数,不推荐
  • Python标准库
    • 是一组模块
from collections import OrderDict

# OrderDict实例的行为几乎与字典相同,区别只在于记录了键-值对的添加顺序

digits = OrderDict()    # 注意这里没有使用花括号,而是调用OrderDict()来创建一个空的有序字典

digits['one'] = 1
digits['two'] = 2
digits['three'] = 3

for english, number in digits.items():
    print(english + '-->' + number)
  • 类编码风格
    • 实例名和模块名都采用小写格式,并在单词之间加上下划线
    • 紧跟在类定义后面应包含一个文档字符串来描述类的功能
    • 在类中,使用一个空行来分隔方法;在模块中,使用两个空行来分隔类。

 

posted on 2019-01-24 10:06  沐沐°  阅读(159)  评论(0编辑  收藏  举报