首页 > temp > 简明python教程 >
-
Python语法基础(3)
请输入你的名字:ghp
你喜欢吃什么?西瓜
是否还有人参与调查[yes/no]yes
请输入你的名字:lily
你喜欢吃什么?哈密瓜
是否还有人参与调查[yes/no]no
调查结果
Ghp喜欢吃西瓜。
Lily喜欢吃哈密瓜。
day_08(函数)
- 定义函数
#定义一个函数
def greet_user():
print("Hello!!!")
greet_user()
Hello!!!
向函数传递信息
在greet_user()括号内添加一个参数
#定义一个函数
def greet_user(username):
print("Hello\t"+username.title()+"\t!!!")
greet_user('GHP')
Hello Ghp !!!
形参和实参
在函数greet_user()的定义中,变量username是一个形参————函数完成其工作所需要的一项信息。在代码greet_user('GHP') 中,值'GHP' 是一个实参。实参是调用函数时传递给函数的信息。我们调用函数时,将要让函数使用的信息放在括号内。在greet_user('GHP')中,将实参'GHP' 传递给了函数greet_user(),这个值被存储在形参username中。
- 传递实参
位置实参
一个显示宠物信息的函数:
def pets(animal_type,animal_name):
'''显示宠物的信息'''
print("我有一条"+animal_type)
print("\n它的名字叫做"+animal_name)
pets('短尾猫','harry')
我有一条短尾猫
它的名字叫做harry
多次调用函数
def pets(animal_type,animal_name):
'''显示宠物的信息'''
print("我有一条"+animal_type)
print("它的名字叫做"+animal_name+"\n")
pets('短尾猫','harry')
pets('哈皮狗','ben')
我有一条短尾猫
它的名字叫做harry
我有一条哈皮狗
它的名字叫做ben
位置实参的顺序很重要
关键字实参
使用关键字实参无需考虑函数中的顺序调用,
def pets(animal_type,animal_name):
'''显示宠物的信息'''
print("我有一条"+animal_type)
print("它的名字叫做"+animal_name+"\n")
pets('短尾猫','harry')
pets(animal_name='micle',animal_type='沙皮猫')
我有一条短尾猫
它的名字叫做harry
我有一条沙皮猫
它的名字叫做micle
默认值
def pets(animal_name,animal_type ='狗'):
'''显示宠物的信息'''
print("我有一条"+animal_type)
print("它的名字叫做"+animal_name+"\n")
pets('happy')
我有一条狗
它的名字叫做happy
等效的函数调用
- 返回值
函数返回的值称为返回值
返回简单值
def get_name(first_name,second_name):
full_name = first_name+ ' ' + second_name
return full_name
name_01 = get_name('周','杰伦')
print(name_01)
周 杰伦
让实参变成可选的
def get_name(first_name,last_name,middle_name = ''):
if middle_name:
full_name = first_name +' ' + middle_name +' ' + last_name +"\n"
else:
full_name = first_name +' ' + last_name +"\n"
return full_name
name_01 = get_name('周','杰','伦')
print(name_01)
name_02 = get_name('周','杰')
print(name_02)
Python将非空字符串解读为True,因此如果函数调用中提供了中间名,if middle_name将为True
周 伦 杰
周 杰
返回字典
def build_person(first_name,last_name):
person = {'first':first_name,'last':last_name}
return person
message = build_person("周杰伦","张学友")
print(message)
{'first': '周杰伦', 'last': '张学友'}
存储年龄
def build_person(first_name,last_name,age = ''):
person = {'first':first_name,'last':last_name}
if age:
person['age'] = age
return person
message = build_person("周杰伦","张学友",28)
print(message)
{'first': '周杰伦', 'last': '张学友', 'age': 28}
结合使用函数和while循环
def get_name(first_name,second_name):
full_name = first_name+ " " +second_name
return full_name
while True:
print("请输入你的名字")
print("输入'q' 后可退出程序")
f_name = input("请输入你的姓氏")
if f_name == 'q':
break
l_name = input("请输入你的名")
if l_name == 'q':
break
your_name = get_name(f_name,l_name)
print("你好,"+your_name+"\n")
请输入你的名字
输入'q' 后可退出程序
请输入你的姓氏周
请输入你的名杰伦
你好,周 杰伦
请输入你的名字
输入'q' 后可退出程序
请输入你的姓氏q
>>>
- 传递列表
假设有一个用户列表,我想要问候其中的每位用户。下面的示例将一个名字列表传递给一个名为greet_users()的函数
#向函数传送列表
def greet_user(names):
for name in names:
message = "你好,"+ name+"。\n"
print(message)
user_name = ['harry','ben','jack']
greet_user(user_name)
你好,harry。
你好,ben。
你好,jack。
在函数中修改列表
一家为用户提交的设计制作3D打印模型公司。需要打印的设计存储在一个列表中,打印后移到另一个列表中。下面是在不使用函数的情况下模拟这个过程的代码:
#首先创建一个列表,其中包含一些要打印的软件
first_list = ['iphone case','robot pendant','dodecahedron']
completed_models = []
#模拟打印每个设计,直到没有打印的设计为止
#打印每个设计后,都将其移到列表completed_models中
while first_list:
current_design = first_list.pop()
#模拟根据设计制作3D打印模型的过程
print("打印模型:"+ current_design)
completed_models.append(current_design)
#显示打印好的所有模型
print("\n所有已经打印好的模型")
for completed_model in completed_models:
print(completed_model )
打印模型:dodecahedron
打印模型:robot pendant
打印模型:iphone case
所有已经打印好的模型
dodecahedron
robot pendant
iphone case
- 传递任意数量的实参
有时候你不知道需要接受多少个参数
例如,一个制作披萨的函数,他需要接受很多的配料,但是你无法预测顾客需要多少种配料。下面的函数只有一个形参,但是不管提供多少的实参,这个形参都将他们统统收入囊中:
def make_pizza(*toppings): #星号*让Python创建了一个名为toppings的新元组
''' 打印顾客点的配料'''
print(toppings)
make_pizza('榴莲')
make_pizza('火腿','猪肉','牛肉','芝士','虾仁')
('榴莲',)
('火腿', '猪肉', '牛肉', '芝士', '虾仁')
对客户的要求进行遍历
def make_pizza(*toppings):
''' 打印顾客点的配料'''
print("\n顾客点的披萨中的配料有")
for i in toppings:
print(i,end=" ")
make_pizza('榴莲')
make_pizza('火腿','猪肉','牛肉','芝士','虾仁')
顾客点的披萨中的配料有
榴莲
顾客点的披萨中的配料有
火腿 猪肉 牛肉 芝士 虾仁
结合使用位置实参和任意数实参
如果前面的函数还需要一个表示披萨尺寸的实参,必须将该形参放在形参*toppings的前面:
def make_pizza(size,*toppings):
''' 打印顾客点的配料'''
print("\n顾客点的披萨尺寸为"+str(size)+",其中的中的配料有")
for i in toppings:
print(i,end=" ")
make_pizza(14,'榴莲')
make_pizza(12,'火腿','猪肉','牛肉','芝士','虾仁')
顾客点的披萨尺寸为14,其中的中的配料有
榴莲
顾客点的披萨尺寸为12,其中的中的配料有
火腿 猪肉 牛肉 芝士 虾仁
使用任意数量的关键字实参
在函数中创建一个 字典,以存放输入的键值对
def user_name(xing,ming,**other):
name = {}
print("你的姓氏是:")
name['姓氏'] = xing
print(name['姓氏'])
print("你的名字是:")
name['名字'] = ming
print(name['名字'] )
for k,v in other.items():
name[k] = v
return name
message = user_name('周','杰伦',hobby='打篮球',goodfor='唱歌')
print(message)
你的姓氏是:
周
你的名字是:
杰伦
{'姓氏': '周', '名字': '杰伦', 'hobby': '打篮球', 'goodfor': '唱歌'}
- 将函数存储在模块中
导入特定的函数
from 模块名 import 函数名
from 模块名 import 函数名1,函数名2,函数名3, ......
使用as给函数指定别名
from 模块名 import 函数名 as 自己定的其他名字
使用as给模块指定别名
import 模块名 as 自己定的其他名字
导入模块的所有函数
使用*可以导入模块中的所有函数
from 模块名 import *
day_09(类)
根据要求来创建对象被称为实例化,基于类创建对象时,每个对象都自动具备这种通用行为,然后可以根据需要赋予每个对象独特的个性。使用面向对象编程,可以模拟现实情景,其逼真程度达到令我惊讶的地步。
- 创建和使用类
创建一个Dog类,使其每个实例都存储名字和年龄。我们将赋予小狗蹲下和打滚的能力。
#encoding:utf-8
class Dog():
'''一次模拟小狗的简单尝试'''
def __init__(self,name,age):
'''初始化属性name和age'''
self.name = name
self.age = age
def sit(self):
'''模拟小狗被命令蹲下'''
print(self.name.title()+"现在已经蹲下了")
def roll_over(self):
'''模拟小狗被命令时打滚'''
print(self.name.title()+"现在正在打滚")
-
方法__init__()
方法 init()是一个特殊的方法,当你根据Dog类创建实例时,Python都会自动运行它。在这个方法的名称中,开头和末尾各有两个下划线,这是一种约定,旨在避免Python默认方法与普通方法发生名称冲突。
我们将方法__init__()定义成了包含三个参数:self、name、age。在这个方法中。形参self必不可少,还须位于其他形参的前面。为何必须包含self?因为Python调用这个方法来创建Dog实例时,将自动传入实参self。每个与类相关的联的方法都自动传递实参self,它是一个指向实例本身的引用,让实例能够访问类中的属性和方法。
以self为前缀的变量都可以供类中的所有方法使用,我们还可以通过类的任何实例来访问这些变量。可以通过实例访问的变量称为属性。
根据类创建实例
下面来创建一个表示特定小狗的实例(基于上面创建的Dog类):
my_dog = Dog('harry',12)
print("我的狗的名字是"+my_dog.name.title()+"。")
print("\n我的狗现在已经"+str(my_dog.age)+"岁了。")
我的狗的名字是Harry。
我的狗现在已经12岁了。
调用方法
my_dog = Dog('harry',12)
my_dog.sit()
my_dog.roll_over()
Harry现在已经蹲下了
Harry现在正在打滚
创建多个实例
#访问属性
my_dog = Dog('harry',12)
print("我的狗的名字是"+my_dog.name.title()+"。")
print("我的狗现在已经"+str(my_dog.age)+"岁了。")
#调用方法
my_dog.sit()
my_dog.roll_over()
#创建多个实例
your_dog = Dog('jack',11)
print("\n你的狗的名字是"+your_dog.name.title()+"。")
print("你的狗现在已经"+str(your_dog.age)+"岁了。")
your_dog.sit()
your_dog.roll_over()
我的狗的名字是Harry。
我的狗现在已经12岁了。
Harry现在已经蹲下了
Harry现在正在打滚
你的狗的名字是Jack。
你的狗现在已经11岁了。
Jack现在已经蹲下了
Jack现在正在打滚
- 动手试一试
餐馆:创建一个名为resturant 的类,其方法__init__()设置两个属性:restaurant_name和cuisine_type 。创建一个名为describe_restaurant()的方法和一个名为open_restaurant()的方法,其中前者打印前述两项信息,而后者打印一条信息,指出餐馆正在营业。
根据这个类创建一个名为restaurant的实例,分别打印其两个属性,再调用前述两个方法。
#encoding:utf-8
class Restaurant():
def __init__(self,restaurant_name,cuisine_type):
'''创建餐馆的两个属性'''
self.restaurant_name = restaurant_name
self.cuisine_type = cuisine_type
def describe_restaurant(self):
print("这家餐馆的名字叫做"+self.restaurant_name.title())
print("这家餐馆的烹饪类型是"+self.cuisine_type)
def open_restaurant(self):
print("这家餐馆正在营业")
#创建一个名为message 的实例
message_01 = Restaurant('mqilin','西餐厅')
message_02 = Restaurant('广州酒家','粤菜')
message_01.open_restaurant()
message_01.describe_restaurant()
print("\n")
message_02.open_restaurant()
message_02.describe_restaurant()
这家餐馆正在营业
这家餐馆的名字叫做Mqilin
这家餐馆的烹饪类型是西餐厅
这家餐馆正在营业
这家餐馆的名字叫做广州酒家
这家餐馆的烹饪类型是粤菜
- 使用类和实例
car类
下面来编写一个表示汽车的类,它存储了有关汽车的信息,还有一个汇总这些信息的方法:
#encoding:utf-8
class Car():
'''一次模拟汽车的简单尝试'''
def __init__(self,make,model,year):
'''初始化汽车的属性'''
self.make = make
self.model = model
self.year = year
def get_descriptive_name(self):
'''返回简洁的信息描述'''
long_name = str(self.year) + ' ' + self.make + ' ' + self.model
return long_name
my_new_car = Car('BMW','a1',2020)
print(my_new_car.get_descriptive_name())
2020 BMW a1
下面给它添加一个随时间变化的属性,它存储汽车的总里程。
给属性指定默认值
下面添加一个名为odometer_reading,其初始值为0.我们还添加了一个名为read_odometer的方法,用于读取汽车的里程表:
#encoding:utf-8
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
def read_odometer(self):
'''打印一条指出汽车里程的信息'''
print("你的汽车已经行驶了"+str(self.odometer_reading)+"km!")
my_new_car = Car('BMW','a1',2020)
print(my_new_car.get_descriptive_name())
my_new_car.read_odometer()
2020 BMW a1
你的汽车已经行驶了0km!
修改属性的值
#encoding:utf-8
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
def read_odometer(self):
'''打印一条指出汽车里程的信息'''
print("你的汽车已经行驶了"+str(self.odometer_reading)+"km!")
my_new_car = Car('BMW','a1',2020)
print(my_new_car.get_descriptive_name())
# my_new_car.read_odometer()
my_new_car.odometer_reading = 23
my_new_car.read_odometer()
直接修改属性的值
~~~
my_new_car.odometer_reading = 23
my_new_car.read_odometer()
2020 BMW a1
你的汽车已经行驶了23km!
通过方法修改属性的值
~~~
my_new_car.update_odmoeter(25)
my_new_car.read_odometer()
2020 BMW a1
你的汽车已经行驶了25km!
可以对update_odometer()进行扩展,使其在修改里程表读数时做额外的工作。下面来添加一些逻辑,禁止任何人将里程表读数往回调:
~~~
def update_odmoeter(self,message):
'''
将里程表读书设置为指定的值
禁止里程表读数往回调
'''
if message >= self.odometer_reading:
self.odometer_reading = message
else:
print("你不可以将数值回调")
~~~
通过方法对属性的值进行递增
#encoding:utf-8
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
def read_odometer(self):
'''打印一条指出汽车里程的信息'''
print("你的汽车已经行驶了"+str(self.odometer_reading)+"km!")
def update_odmoeter(self,message):
'''
将里程表读书设置为指定的值
禁止里程表读数往回调
'''
if message >= self.odometer_reading:
self.odometer_reading = message
else:
print("你不可以将数值回调")
def increment_odometer(self,mil_message):
'''增加里程表的读数'''
self.odometer_reading += mil_message
my_use_car = Car('本田','雅阁',2015)
print(my_use_car.get_descriptive_name())
my_use_car.update_odmoeter(23500)
my_use_car.read_odometer()
my_use_car.increment_odometer(100)
my_use_car.read_odometer()
2015 本田 雅阁
你的汽车已经行驶了23500km!
你的汽车已经行驶了23600km!
-
继承
编写类时,并非总是要从空白开始。如果你编写的类是另一个现成类的特殊版本,可以使用继承。一个类继承另一个类时,他将自动获取另一个类的所有属性和方法;原有的类称之为父类,而新类称之为子类。子类继承了父类的所有属性和方法,同时还可以定义自己的属性和方法。
子类的方法__init__()
下面来模拟电动车。电动车是一种特殊的汽车,因此我们可以在前面创建的Car类的基础上创建类ElectricCar,这样我们就只需为电动车特殊的属性和行为编写代码
#来创建一个电动车的类
class ElectricCar(Car):
'''电动车独特的属性'''
def __init__(self,make,model,year):
'''初始化父类的属性'''
super().__init__(make,model,year)
my_tesla = ElectricCar('tesla','model s',2016)
print(my_tesla.get_descriptive_name())