Python从基础学起之函数、类、文件和异常

用户输入

函数input()

函数input() 让程序暂停运行,等待用户输入一些文本。获取用户输入后,Python将其存储在一个变量中,以方便你使用。

使用int()获取数值输入
height = input("How tall are you, in inches? ")
height = int(height)

1. 函数

定义函数
def greet_user(param1,param2,...):
    """显示简单的问候语"""
    print("Hello!")
    [return] xxx
greet_user()

传递实参:位置实参、关键字实参、默认值

关键字实参
def describe_pet(animal_type, pet_name):
"""显示宠物的信息"""
    print("\nI have a " + animal_type + ".")
    print("My " + animal_type + "'s name is " + pet_name.title() + ".")
describe_pet(animal_type='hamster', pet_name='harry')
默认值实参
def describe_pet(pet_name, animal_type='dog'):

传递任意数量的实参

形参名*toppings中的星号让Python创建一个名为toppings 的空元组,并将收到的所有值都封装到这个元组中。

def make_pizza(*toppings):
"""打印顾客点的所有配料"""
    print(toppings)
make_pizza('pepperoni')
make_pizza('mushrooms', 'green peppers', 'extra cheese')
  • 结合使用位置实参和任意数量实参
def make_pizza(size, *toppings):
    """概述要制作的比萨"""
    print("\nMaking a " + str(size) +
    "-inch pizza with the following toppings:")
    for topping in toppings:
        print("- " + topping)
make_pizza(16, 'pepperoni')
make_pizza(12, 'mushrooms', 'green peppers', 'extra cheese')

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

  • 使用任意数量的关键字实参
def build_profile(first, last, **user_info):
"""创建一个字典,其中包含我们知道的有关用户的一切"""
    profile = {}
    profile['first_name'] = first
    profile['last_name'] = last
    for key, value in user_info.items():
        profile[key] = value
    return profile

形参**user_info 中的两个星号让Python创建一个名为user_info 的空字典,并将收到的所有名称—值对都封装到这个字典中。

将函数存储在模块中

要让函数是可导入的,得先创建模块。模块是扩展名为.py的文件,包含要导入到程序中的代码。可使用import module_name,这种方式的导入,对于调用函数时要module_name.function_name的形式调用;也可以使用from module_name import function_0,function_1…来导入模块的指定函数,这种方式的导入可以在调用函数时,不需要指定模块名。

此外,我们可以使用as来给模块名,函数名来指定别名,具体是from pizza as pa import make_pizza as mp;而from module_name import *是可以导入模块中的全部方法,在调用方法时,可以不需要指定模块名,不过这个是不推荐的。

2. 类

在Python中,首字母大写的名称指的是类。类中的函数称为方法 ;

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

my_dog = Dog('willie', 6)//创建实例

def__init__(self,name,age)方法中,形参self是必不可少的,需要位于其他形参之前。因为Python调用这个__init__() 方法来创建Dog 实例时,将自动传入实参self 。每个与类相关联的方法调用都自动传递实参self ,它是一个指向实例本身的引用,让实例能够访问类中的属性和方法。方法__init__()并未显式地包含return 语句,但Python自动返回一个实例

修改属性的值

可以以三种不同的方式修改属性的值:直接通过实例进行修改;通过方法进行设置;通过方法进行递增(增加特定的值)

继承

创建子类时,父类必须包含在当前文件中,且位于子类前面。定义子类时,必须在括号内指定父类的
名称。方法__init__() 接受创建Car 实例所需的信息

class ElectricCar(Car):
    def __init__(self, make, model, year):
        """初始化父类的属性"""
        super().__init__(make, model, year)
        self.battery = Battery() //将实例用作属性

my_tesla.battery.describe_battery()//调用属性battery这个实例

3. 文件和异常

打开文件

with open('pi_digits.txt') as file_object:
    contents = file_object.read()
    print(contents)
    lines = file_object.readlines()//从文件中读取每一行,并将其存储在一个列表中

关键字with在不再需要访问文件后将其关闭。函数open()接受一个参数:要打开的文件的名称。read() 到达文件末尾时返回一个空字符串

写入文件

with open(filename, 'w') as file_object:
    file_object.write("I love programming.")

第一个实参也是要打开的文件的名称;第二个实参(’w’)告诉Python,我们要以写入模式打开这个文件。读取模式 (’r’ )==>默认、写入模式 (’w’ )、附加模式 (’a’ )或让你能够读取和写入文件的模式(’r+’ )
注意:如果你要写入的文件不存在,函数open() 将自动创建它。如果指定的文件已经存在,Python将在返回文件对象前清空该文件。

4. 异常

try:
    print(5/0)
except ZeroDivisionError:
    print("You can't divide by zero!")
else:
    method()

依赖于try代码块成功执行的代码都放在else 代码块中;

题外话:方法split()以空格为分隔符将字符串分拆成多个部分,并将这些部分都存储到一个列表中。结果是一个包含字符串中所有单词的列表,虽然有些单词可能包含标点。

存储数据

模块json 让你能够将简单的Python数据结构转储到文件中,并在程序再次运行时加载该文件中的数据。

import json

numbers = [2, 3, 5, 7, 11, 13]
filename = 'numbers.json'
with open(filename, 'w') as f_obj:
    json.dump(numbers, f_obj)//存入到文件中
with open(filename) as f_obj:
    numbers_1 = json.load(f_obj)//将这个列表读取到内存中

测试

可先导入模块unittest 以及要测试的函数,再创建一个继承unittest.TestCase 的类
unittest.TestCase 类包含方法setUp() ,让我们只需创建这些对象一次,并在每个测试方法中使用它们。

import unittest
from name_function import get_formatted_name
class NamesTestCase(unittest.TestCase):
    """..name_function.py"""
    def setUp(self):
        """
        创建一个调查对象和一组答案,供使用的测试方法使用
        """
        question = "What language did you first learn to speak?"
        self.my_survey = AnonymousSurvey(question)
        self.responses = ['English', 'Spanish', 'Mandarin']
    def test_first_last_name(self):
    """能够正确地处理像Janis Joplin这样的姓名吗?"""
        formatted_name = get_formatted_name('janis', 'joplin')
        self.assertEqual(formatted_name, 'Janis Joplin')
unittest.main()
方法用途
assertEqual(a, b)核实a == b
assertNotEqual(a, b)核实a != b
assertFalse(x)核实x 为False
assertTrue(x)核实x 为True
assertIn(item , list )核实 item 在 list 中
assertNotIn(item , list )核实 item 不在 list 中
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值