Python基础篇

起步

  • 命令行运行 python 即可查看安装信息
  • 运行如下python代码也可查看安装版本:
import sys
print (sys.version)

注意: Python3 和Python2的输出语法不一样,一个要括号,一个不要括号

  • Sublime里面python运行环境的安装:Tools->Building System->New Build System,输入以下代码:
{
    "cmd": ["******","-u","$file"],
    "file_regex": "^[ ]*File \"(...*?)\", line ([0-9]*)",
    "selector": "source.python",
}

其中******填入你的python安装目录路径,比如”D:/Python36/python3.exe”,注意路径中的斜杠方向

变量和简单数据类型

变量

  • 变量名只能包含字母、数字和下划线,且以字母或下划线打头

字符串

  • 字符串可以是单引号也可以是双引号
  • title()将每个单词的首字母改为大写
  • upper()将字符串全部改为大写
  • lower()将字符串全部改为小写
  • +号用来拼接
  • 制表符\t,换行符\n
  • str()将非字符串值表示为字符串,如str("23")将整型23变成字符串
  • strip()返回字符串去掉左右两边指定字符或者空格(未指定字符时)的副本;同理还有lstrip()rstrip()去掉左边和右边的指定字符。

数字

  • + - * /表示加减乘除运算

    注意python3中3/2输出结果1.5,但是在python2中输出为1

  • 两个乘号**表示乘方

    题外话:使用import this可以查看编写python代码的指导原则(python之禅)。不要企图编写完美无缺的代码;先编写行之有效的代码,再决定是对其做进一步的改善还是转而去编写新代码。

列表

表示

  • 用方括号[ ]表示列表,用逗号分隔。
  • 索引从0开始;可以直接用-1返回最后一个元素,或者-2返回倒数第二个元素

添加元素

  • 使用.append(value)向列表末尾添加元素value
  • 使用.insert(index,value)向列表中索引index的地方插入元素value

删除元素

已知元素索引

  • 使用del删除元素。如del motos[1]删除了列表motos中的第二个元素
  • 使用.pop(index)来弹出元素。弹出指定index位置的元素,若未指定index则弹出列表末尾元素

已知元素值

  • 使用.remove(value)来删除第一个值为指定的value的元素

组织列表

  • 使用.sort()方法对列表永久性排序;通过.sort(reverse=True)进行逆序排序
  • 使用sorted(list)方法对list列表进行临时排序。比如sorted(cars)就是对cars进行临时排序。
  • 使用.reverse()方法反转列表中元素的排列顺序
  • 使用len(list)方法获取list列表的长度

操作列表

  • 使用for item in items:进行遍历

    注意冒号和代码缩进

  • 使用list(range(1,6))生成列表[1,2,3,4,5];使用list(range(2,11,2))生成列表[2,4,6,8,10]
  • 对数字列表digits=[1,2,3,4,5,6,7,8,9,0]使用min(digits)max(digits)sum(digits)找出列表的最小值、最大值和总和。
  • 使用squares=[value**2 for value in range(1,5)]来生成列表squares=[1,4,9,16]
  • 使用digits[from:to]返回digits列表从索引from到to的一个切片。to为空表示到列表末尾,为-1表示到最后一个元素为止。from也是如此。
  • 使用list_copy=list[:]来复制一个列表

    注意:list_copy=list会让list_copy和list指向同一个列表

  • 不可变的列表称为元组tuple,其元素值不可改变。元组用法和列表类似,但是元组使用圆括号而不是方括号来标识。

if语句

  • 一个等号=是赋值,两个等号==是条件判断“相等?”,!=表示“不相等?”
  • 逻辑连接词,and必须全部为真则为真;or至少一个为真则为真
  • 检查特定值是否包含在列表中用in;检查特定值是否不包含在列表中用not in
  • 使用if-elif-else结构,更常用if-elif-elif
  • 使用if list:来判断list是否为空

字典

  • {"key1":"value1","key2":"value2"}存储键值对信息。

    注意:python不关心键值对的添加顺序,只关心键和值的关联关系

  • 使用del dic_name["key"]删除键值对

  • 使用for key,value in dic.items():来遍历字典
  • 使用for key in dic.keys():来遍历字典中的所有键

    注意:遍历字典时,会默认遍历所有的键。因此将代码for key in dic.keys():替换成for key in dic:结果是一样的

  • 使用for value in dic.values()可以遍历字典中所有的值

    可以嵌套使用sorted()来临时排序,使用set()来过滤重复值

  • 在字典中嵌套列表,在字典中嵌套字典,在列表中嵌套字典

用户输入和while循环

  • 代码message=input("Please enter: ")给出输入提示,并将输入存放在message中

    注意:python将用户输入作为字符串存入。在需要时可以用int()将其转换成数字
    区别:python2中使用raw_input()作为输入(和python3中的input()功能一样),python2中也包含input()函数,但其将用户输入解读为python代码

  • 关键字breakcontinue,还有while循环条件,标志的运用

  • 使用如下代码删除pets列表中的所有cat元素
while 'cat' in pets:
    pets.remove('cat')

函数

定义函数

  • 函数常见格式如下
def function_name(args):
    """文档字符串docstring的注释,用三引号括起,描述函数的功能"""
    print ("Hello")

位置实参

  • 函数调用时形参基于实参的顺序依次关联,这种方式是位置实参
  • 如下使用位置实参函数调用,必须注意参数顺序
def person(name,age):
    print (name+" is "+age)
person("xgx","23")

关键字实参

  • 用名称-值对传递给函数
def person(name,age):
    print (name+" is "+age)
person(age="23",name="xgx")
  • 使用关键字实参时,务必准确地指定函数定义中的参数名

默认值

  • 编写函数时可以给每个形参指定默认值
def person(name,age="23"):
    print (name+" is "+age)
person("xgx")
  • 使用默认值时,在形参列表中必须先列出没有默认值的形参,再列出有默认值的形参

传递任意数量的实参

  • 对如下代码,形参名*toppings中的星号让python创建一个名为toppings的 空元组 ,并将收到的所有值都封装到这个元组中
def make_pizza(*toppings):
    """打印顾客点的所有配料"""
    print (toppings)
  • 下面函数的定义要求提供名和姓,同时允许用户根据需要提供任意数量的键值对。形参user_info中的两个星号让Python创建一个名为user_info的 空字典** ,并将收到的所有名称-值对都封装到这个字典中。
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_profile = build_profile('albert','einstein',location='princetion',field='physics')
print (user_profile)
# output: {'first_name': 'albert', 'last_name': 'einstein', 'location': 'princetion', 'field': 'physics'}

将函数存储在模块中

  • 导入整个模块,使用import语句导入名为moudle_name.py的整个模块。
import module_name
moudle_name.function_name()
  • 导入模块中的特定函数
from module_name import function_name
from module_name import function_0, function_1, function_2
  • 使用as给函数指定别名
from module_name import function_name as fn
  • 使用as给模块指定别名
import module_name as mn
  • 导入模块中的所有函数
from module_name import *

注意:由于导入了每个函数,可通过名称来调用每个函数,而无需使用句点表示法。然而python可能遇到多个重名的函数或者变量,进而覆盖函数。所以推荐做法是要么只导入你需要的函数,要么导入整个模块并使用句点表示法。

函数编写指南

  • 应该给函数指定描述性名称,且只使用小写字母和下划线;给模块命名时也应如此
  • 采用文档字符串格式简要地阐述函数的功能
  • 给形参指定默认值时,等号两边不要有空格
  • 如果程序或模块包含多个函数,使用两个空行将相邻的函数分隔开
  • 所有的import语句都应放在文件开头

创建和使用

  • 常见结构如下
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.title()

my_car = Car('audi', 'a4', 2016)
print(my_car.get_descriptive_name())
  • __init__()方法,每次实例化类时都会运行此方法。此方法必须包含形参self,它是一个指向实例本身的引用。
    在python2中创建类需要在定义类时括号中包含单词object,如 class Car(object):
  • 类中的每个属性都必须有初始值,即使这个值是0或者空字符串。可以无需提供初始值的形参,而在init()方法中设置属性的默认初始值

继承

  • 创建子类时,父类必须包含在当前文件中,且位于子类前面。定义子类时,必须在括号内指定父类的名称。子类继承父类所有的属性和方法。
  • 子类继承写法如下,另添加了特有属性battery_size
class ElectricCar(Car):
    """电动汽车的独特之处"""

    def __init__(self, make, model, year):
        """初始化父类的属性,再初始化电动汽车特有的属性"""
        super().__init__(make, model, year)
        self.battery_size = 70
  • python2中的继承稍有不同:函数super()中需要两个实参,子类名和对象self
class Car(object):
    def __init__(self, make, model, year):
        # snip

class ElectricCar(Car):
    def __init__(self, make, model, year):
        super(ElectricCar, self).__init__(make, model, year)
        # snip
  • 在子类中定义和父类同名的方法即是方法重写
  • 将实例用作属性,如下ElectricCar中的battery的使用
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 = ElectricCar('tesla', 'model s', 2016)
print(my_tesla.get_descriptive_name())
my_tesla.battery.describe_battery()

导入类

  • 在一个模块中可以存储一个或多个类,可以从一个模块中导入一个或多个类。导入多个类时用逗号分隔。
from module_name import class_name
from module_name import class_0, class_1
  • 你还可以导入整个模块,再使用句点表示法访问需要的类。推荐使用此方法。使用module_name.class_name语法
import module_name
  • 导入模块中所有的类。不推荐此方法。
from module_name import *
  • 还在一个模块中导入另一个模块

Python标准库

  • python标准库是一组模块,你可以使用标准库中的任何函数和类。
  • 模块collections中的OrderedDict类创建一个字典,并记录其中的键-值对的添加顺序。它兼具列表和字典的主要优点。
from collections import OrderedDict
my_dic = OrderedDict()

类编码风格

  • 类名应采用驼峰命名法,即将类名中的每个单词的首字母都大写,而不使用下划线。实例名和模块名都采用小写格式,并在单词之间加上下划线。
  • 对每个模块和每个类,应该包含一个文档字符串描述其功能。
  • 在类中使用一个空行来分割方法;而在模块中使用两个空行来分割类。
  • 需要同时导入标准库中的模块和你编写的模块时,先编写导入标准库模块的import语句,再添加一个空行,然后编写导入你自己编写的模块的import语句。

文件和异常

从文件中读取数据

  • 读取文件示例如下:
with open("pi.txt") as file_object:
    contents = file_object.read()
    print(contents)

with关键字在不再需要访问文件后将其关闭

  • 可使用相对路径或者绝对路径访问文件。如下是Linux和OS X系统中的示例:
file_path = '/home/gabear/other_files/text_files/filename.txt'
with open(file_path) as file_object:
  • 在Windows系统中,需要使用反斜杠\。由于反斜杠在python中被视为转义标记,为在Windows中确保万无一失,应以原始字符串的方式指定路径,即在开头的单引号前加上r。Windows系统中示例如下:
file_path = r'C:\Users\gabear\other_files\text_files\filename.txt'
with open(file_path) as file_object:

推荐将数据文件存储在程序文件所在的目录,然后使用相对路径访问

  • 逐行读取文件内容。示例如下:
filename = 'pi.txt'
with open(filename) as file_object:
    for line in file_object:
        print(line.rstrip())

在文件中,每行的末尾都有一个换行符,而print语句也会加上一个换行符,因此打印出来结果每行末尾都有两个换行符。可用rstrip()去除空行。

  • 读取并使用文件内容。示例如下:
filename = 'pi.txt'
with open(filename) as file_object:
    lines = file_object.readlines()

for line in lines:
        print(line.rstrip())

注意:读取文本文件时,Python将其中的所有文本都解读为字符串。若读取并使用数值,需要使用int()float()将其转换成整数或浮点数。

写入文件

  • 写入文件示例如下
filename = 'programming.txt'
with open(filename, 'w') as file_object:
    file_object.write('I love reading.\n')
    file_object.write('I love programming.\n')
  • open()的第二个实参可以是读取模式'r'、写入模式'w'、附加模式'a'或者能够读取和写入文件的模式'r+'。如果省略了模式参数,Python将以默认的只读模式打开文件。
  • 如果你要写入的文件不存在,函数open()将自动创建它。注意若以写入模式'w'打开文件时若文件已存在,Python将在返回文件对象前清空该文件。

异常

  • 异常示例如下:
def count_words(filename):
    """计算一个文件大致包含多少个单词"""
    try:
        with open(filename) as file_object:
            contents = file_object.read()
    except FileNotFoundError:
        print("Sorry, the file " + filename + " does not exist.")
    else:
        # 计算文件大致包含多少个单词
        words = contents.split()
        num_words = len(words)
        print("The file " + filename + " has about " + str(num_words) + " words.")


filename = 'programming.txt'
count_words(filename)

方法split()以空格为分隔符将字符串分拆成多个部分,并存储到列表中。

  • 代码块try-except-else的工作原理大致如下:Python尝试执行try代码块中的代码,只有可能引发异常的代码才需要放在try语句中;依赖于try代码块成功执行的代码都应放在else代码块中;except代码块告诉Python,如果它尝试运行try代码块中的代码时引发了指定的异常,该怎么办。
  • 一些其他关键词用法:
try:
    # code
except ZeroDivisionError as e:
    raise e
else:
    pass

存储数据

  • JSON(JavaScript Object Notation)。主要是json模块的使用,包括json.dump()json.load()。函数json.dump()接收两个实参:要存储的数据以及可用于存储数据的文件对象。
  • 一个小例子如下:
# number_writer.py
# json.dump()存储数据
import json

numbers = [2, 3, 5, 7, 11]

filename = 'numbers.json'
with open(filename, 'w') as f_obj:
    json.dump(numbers, f_obj)
# number_reader.py
# json.load()读取数据
import json

filename = 'numbers.json'
with open(filename) as f_obj:
    numbers = json.load(f_obj)

print(numbers)

测试代码

测试函数

  • 一个完整的测试函数的例子:
# name_function.py
def get_formatted_name(first, last, middle=''):
    """生成整洁的姓名"""
    if middle:
        full_name = first + ' ' + middle + ' ' + last
    else:
        full_name = first + ' ' + last
    return full_name.title()
# test_name_function.py
import unittest
from name_function import get_formatted_name

class NamesTestCase(unittest.TestCase):
    """测试name_function.py"""

    def test_first_last_name(self):
        """能够正确地处理像gao xiong这样的名字吗?"""
        formatted_name = get_formatted_name('gao', 'xiong')
        self.assertEqual(formatted_name, 'Gao Xiong')

    def test_first_last_middle_name(self):
        """能够正确地处理像xiong gao xiong这样的名字吗?"""
        formatted_name = get_formatted_name('xiong', 'xiong', 'gao')
        self.assertEqual(formatted_name, 'Xiong Gao Xiong')

unittest.main()
  • 首先必须导入模块unittest和要测试的函数;
  • 然后创建继承unittest.TestCase的类,你可以随便给这个类命名,但最好让它看起来与要测试的函数有关,并包含Test字样;
  • 在类中编写测试方法,测试方法名必须以test_打头,这样Python才会自动运行;
  • 最后注意.assertEqual()断言方法的使用。

测试类

  • Python在unittest.TestCase类中提供了很多断言方法。下表描述了6个常用的断言方法。
方法 用途
assertEqual(a, b) 核实 a == b
assertNotEqual(a, b) 核实 a != b
assertTrue(x) 核实 x 为 True
assertFalse(x) 核实 x 为 False
assertIn(item, list) 核实 item 在 list 中
assertNotIn(item, list) 核实 item 不在 list 中
  • unittest.TestCase()类中包含了setUp()方法,Python将先运行它,再运行各个以test_打头的方法。这样,测试类下面的每个测试方法都可以使用在方法setUp()中创建的对象了。这个方法很实用。

  • 运行测试用例时,每完成一个单元测试,Python都打印一个字符:测试通过时打印一个句点;测试引发错误时打印一个E;测试导致断言失败时打印一个F。


参考书籍:《Python编程从入门到实践》,【美】Eric Matthes 著,人名邮电出版社

你可能感兴趣的:(Python)