用户输入
函数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 中 |