一、用户输入和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)
- 类编码风格
- 实例名和模块名都采用小写格式,并在单词之间加上下划线
- 紧跟在类定义后面应包含一个文档字符串来描述类的功能
- 在类中,使用一个空行来分隔方法;在模块中,使用两个空行来分隔类。