VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > temp > 简明python教程 >
  • Python语法基础(3)

"请输入你的名字:") response = input("你喜欢吃什么?") responses[name] = response #看看是否还有人参与调查 message = input("是否还有人参与调查[yes/no]") if message == "no": active = False print("\n调查结果") for name,response in responses.items(): print(name.title()+"喜欢吃"+response.title()+"。\n")
请输入你的名字: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()+"现在正在打滚")
        
  1. 方法__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())

      



  

相关教程