前言

参考资料

笔者Python学习次要以《Python编程:从入门到实战》这本书为主,笔记的思路参考书里的脉络。其次还有笔者一年前在慕课上看的北理的嵩天传授的Python课程。嵩天传授的课很好,最大的特点是每个版块都有残缺的示例代码。但可能对老手小白不太敌对,有些不罕用的函数容易弄混。《Python编程:从入门到实战》更适宜零根底学习,里边会提到一些互通的编程思维和Python的格局标准。

联合罕用函数、办法

因为笔者有Java的编程根底,因而这里只记录Python跟Java不一样的中央以及一些易忘点和难点,重点放在Python的语法根底。对于老手敌人还是先看书为好。联合《Python罕用函数、办法示例总结(API)》来看可能成果会好一些。


1. 变量与简略数据结构

  • .py指出这是一个Python程序,编辑器将应用Python解释器运行它;
  • Python解释器读取整个程序,确定其中每个单词含意;
  • 程序无奈胜利运行时,解释器会提供一个traceback。traceback是一条记录,指出解释器尝试运行代码时,在什么中央陷入困境;
  • 在Python中,能够用单引号双引号括起字符串;
  • Python中的本义符:

    • \n换行(光标到上行首);
    • \r回车(光标回到本行首);
    • \t制表符,\n\t示意换行并在下一行结尾增加制表符;
    • \b回退;
  • Python2中,有些print语句蕴含括号,有些不蕴含;
  • Python应用两个乘号示意乘方,如:3 ** 2 == 9
  • Python2中除法\将小数局部间接删除。Python3中保留小数。但在Python2中:3.0 / 2 == 1.5
  • Python之禅:Python的一些编程理念。在终端输出import this即可获取;
  • Python关键字:
  • Python内置函数:


    2. 列表相干======== 一个列表示例:bicycles = [ 'trek', 'cannondale', 'redline']。留神方括号逗号 打印列表示例:print(bicycles) 拜访列表元素:bicycles[0] --- > trek; 拜访列表倒数第x元素:bicycles[-x] --- > 当x=1时输入:redline;* 应用for循环遍历列表`
    for object in list:
    print(object)

  • 列表解析list = [num**2 for num in range(1s, 11)] ---> 输入1到10的平方;
  • 遍历局部列表for object in list[firstNum: lastNum]:
  • 能够应用list[:]的办法复制列表;
  • 元祖相干:

    • Python中将不能批改的值称为不可变的,而不可变的列表称为元祖
    • 在编程上与列表不同之处在于其应用()tuple()或不应用括号;而列表应用[]list()
    • 元组因为创立后不能批改,因而没有非凡操作;
  • 如果提出批改Python语言批改倡议,须要编写Python改良提案(PEP)。PEP 8是最古老的PEP之一,其规定了以下一些Python代码格局标准:

    • 每级缩进4个空格。须要对文本编辑器(或ide)设置tab键为4个空格;
    • Python解释器依据程度缩进解读代码,不关怀垂直间距;
    • 倡议每行不超过个字符;
    • 倡议比拟运算符两边各增加一个空格;

    3. 汇合

  • 一个汇合示例:bicycles = { 'trek', 'cannondale', 'redline'}。留神大括号逗号
  • 汇合的特点是不能反复;
  • 利用汇合数据去重:

    s = set(list)  #利用汇合无反复元素的特点去重l = list(s)  #将汇合转变回列表

    4. If语句

  • Python在查看是否雷同时思考大小写;
  • 大部分时候查看两个指不等的效率更高;
  • 在Python中应用andor示意并与或,而不是&&||
  • 查看列表是否含有特定值的语句:if(object in list),也能够用if(object not in list)
  • Python的if语句根本构造如下(留神冒号):`
    if conditional_test1:
    do something1
    elif conditional_test2:
    do something2
    else:
    do other

  • 判断列表是否为空:if list:

5. 字典

  • 事实上,可将任意Python对象用作字典中的值;
  • 一个字典的示例:alien0 = {'color': 'green', 'points': 5}
  • 遍历字典for key, value in map.items():
  • 遍历字典的键for object in map.keys():for object in map:,因为遍历字典默认遍历所有的键;
  • 按程序遍历字典所有的键:for object in sorted(map.keys()):
  • 遍历字典的值for object in map.values():
  • 遍历字典的值,剔除反复项:for object in set(map.values()):
  • 列表和字典的嵌套层级不应太多,如果太多,可能有更简略的解决问题的计划;

6. 用户输出和while循环

  • 在Python 3里应用input()办法,而在Python 2.7里应用raw_input()办法;
  • 循环语句:while conditional_test:
  • 能够应用break关键字退出循环,这里的循环包含while和for循环;
  • 能够应用continue关键字持续循环;
  • 应用循环解决列表:while object in list:

7. 函数

  • 不带返回值的函数定义示例:

    def greet_user(username, age=1):  #username没有设定默认值必须放在形参列表结尾  """显示简略问候语"""  print("hello, " + username.title() + ", age is " + str(age))greet_user('jesse', 18)  #地位实参greet_user(age=18, username='jesse')  #关键字实参greet_user('jesse')  #应用默认值age=1
    • 第二行为文档字符串正文,形容函数是做什么的;
    • 前面为函数调用;
  • 带一般返回值的函数定义示例:

    def greet_user(username, age=1):  #username没有设定默认值必须放在形参列表结尾  """显示简略问候语"""  print("hello, " + username.title() + ", age is " + str(age))  return username.title()
  • 带字典返回值的函数定义示例:

    def build_person(first_name, last_name):  #username没有设定默认值必须放在形参列表结尾  """返回字典"""  person = {'first': first_name, 'last': last_name}  return person
  • 传递列表参数,列表会批改:

    def greet_users(names):  """传入参数为列表"""  for name in names:      msg = "Hello, " + name.title() + "!"      print(mas)usermanes = ['margot', 'hannah', 'ty']greet_users(usernames)
  • 传递列表参数的正本,列表不会批改:def greet_users(names[:]):
  • 传递任意数量的实参:*toppings能够了解成列表;

    def make_pizza(*toppings):  """打印顾客点的所有配料"""  print(toppings)make_pizza('pepperoni')make_pizza('mushrooms', 'green peppers', 'etra cheese')
    • Python创立一个名为toppings的空元组;
  • 联合应用地位实参和任意数量实参:def make_pizza(size, *toppings):

    • 必须将接收任意数量实参的形参*toppings放在最初;
  • 应用任意数量的关键字实参:\user\_info**能够了解成字典;

    def build_profile(name, **user_info):  """创立一个字典,其中蕴含咱们晓得的无关用户的所有"""  profile = {}  profile['name'] = name    for key, value in user_info.items():      profile[key] = value  return profileuser_profile = build_profile('albert', location='princeton', field='physics')print(user_profile)
  • 在Python中,import的是模块,应用模块.办法(参数)即可调用模块里的函数;
  • 导入特定函数,并应用该函数示例:`
    from module_name import function_0, function_1
    function_0()
    function_1(参数)

  • 应用as给函数指定别名:from model import function as fn;后续应用fn()即可调用function函数;
  • 应用as给模块指定别名:import model as md;后续应用md.function()即可调用函数;
  • 导入模块所有函数:from model import *;后续间接应用model里的函数function()即可调用函数;
  • 能够在函数类应用global关键字申明变量是全局变量;
  • lambda表达式<函数名> = lambda <参数> : <表达式>

    • 示例:

      >>> f = lambda x, y : x + y>>> f(10, 15)25> > > f = lambda : "lambda表达式"  > > > print(f())  > > > lambda表达式
  • 函数与模块编写细节:

    • 内部函数导入的举荐做法:只导入所须要应用的函数 / 导入整个模块并应用句点表示法;
    • 函数和模块的命名应应用小写字母和下划线,而不是驼峰命名法;
    • 函数正文紧跟在函数定义前面,应用文档字符串格局;
    • 给形参指定默认值时,等号=两边不要有空格;

    8. 类与对象

  • 类中的函数叫办法;
  • 一个类示例:模块名为dog.py

    """示意小狗和电子狗的类"""class Dog():  """模仿小狗"""  def __init__(self, name):      """初始化实例"""      self.name = name      self.age = 1  #给属性指定默认值  def get_age(self):       """返回年龄"""       return self.age  def set_age(self, age):      """设置年龄"""      self.age = age  def sit(self):      """模仿小狗被命令时蹲下"""      print(self.name.title() + " is now sitting.")class TinyDog(Dog):  """小狗是狗的子类"""  def __init__(self, name)      """初始化父类的属性"""      super().__init__(name)
    • __init__()办法:形参self必不可少,而且必须位与其余参数后面;
    • 创立Dog实例时,将主动传入实参self。每个与类相关联的办法调用都主动传递实参self,其是一个指向实例自身的利用,让实例可能拜访类中的属性和办法;
    • self.为前缀的变量都可供类中的所有办法应用,像这样能够通过实例拜访的变量称为属性;
  • 无关父子类:

    • 子类和父类必须蕴含在以后文件中,父类必须在子类后面;
    • 子类定义中括号内必须指定父类名称;
    • super()是一个非凡函数,将父类和子类关联起来;
    • 在Python 2.7中,super()办法须要传递两个实参:子类名self,并且父类定义的括号内指定字段object
  • 在Python 2.7中创立类时,须要在括号类内蕴含单词objectclass ClassName(object):
  • 类实例(对象)的示例:

    class Dog():  --snip--my_dog = Dog('willie')dog_name = my_dog.name  #获取属性dog_name = my_dog.get_age()  #通过办法获取属性my_dog.name = 'jucy'  #间接批改属性my_dog.set_age = 18  #通过办法批改属性my_dog.sit()  #调用办法
  • dog.py模块里导入多个类:from dog import Dog, TinyDog
  • 导入整个dog.py模块,而后用句点示意拜访须要的类:import dog
  • collections模块里蕴含一个类OrderedDict。该类的实例行为简直与字典雷同,区别在于其记录了键值对的程序;
  • 类的编码格调:

    • 类采纳驼峰命名法,类中的每个单词首字母大写;
    • 实例名和模块名采纳小写,并在单词之间加上下划线;
    • 一个空行分隔办法;两个空格分隔类;
    • 须要同时导入规范库和模块和

    9. 文件

  • 关上并读取一个文件,并将其内容显示到屏幕上:

    with open('xxx.txt') as file_object:  contents = file_object.read()  print(contents)
    • 关上文件open()和敞开文件close()能够同时应用,但当有bug时close()执行不了会导致文件无奈敞开。不写close()将由Python确定是否敞开文件;
    • with关键字在不再须要拜访文件后将其敞开;
    • 间接打印contents会多出一个空行,能够这样打印print(contens.rstrip())
  • 无关文件绝对路径:

    • Linux和OS X:file_path = '/home/.../xxx.txt'
    • Windows:file_path = C:\...\xxx.txt
    • 倡议将数据文件存储在程序文件所在的目录,或程序文件所在目录的下一级文件夹;
  • 逐行读取:

    with open(filename) as file_object:  for line in file_object:  print(line)
    • 同理,间接打印contents会多出一个空行,能够这样打印print(line.rstrip())
  • 应用with关键字时,open()返回的对象只在with代码块内可用;
  • 在解决文件相干时留神应用strip()rstrip()去除字符串两边的空格;
  • Python将所有文本都解读成字符串;
  • open('xxx.txt', 'w'):以写入形式关上文件;

    • 其余参数还有r读取、a附加、r+读写;
    • a附加:将内容附加到文件开端,而不是覆盖文件原来的内容;
    • w写入模式关上文件须要小心,如果指定文件名已存在,Python将在返回对象前清空文件;
    • Python只能将字符串写入文本文件;

    10. 异样

  • 应用 try-except 解决异样:

    try:  print(5/0)except ZeroDivisionError:  print('捕捉到ZeroDivisionError异样')else:  print('未捕捉异样')finally:  print('无论是否有异样都会执行')
    • 可在except的缩进块里增加关键字pass跳过谬误捕捉;
    • 其中,elsefinally局部的代码块可省;

    11. 测试

  • 应用Python规范库中的模块unittest进行测试;
  • 一个简略的测试示例:

    import unittestfrom model_name import function_nameclass TestCase(unittest.TestCase):  """测试函数function_name"""  def setUp(self):      """构建前置条件"""  def test_function(self):      run_result = function_name(parameter)      self.assertEqual(run_result, correct_result)
*   首先导入模块`unittest`和被测试方法`function_name`;*   而后创立`TestCase`类,其蕴含各种具体的单元测试办法。该类继承`unittest.TestCase`类;*   `setUp()`办法的作用是创立前置条件;*   编写测试方法`test_function`,办法名必须以`test_`打头;*   应用断言`assertEqual()`判断函数执行后果与预期后果的差异;*   `unittest.main()`让Python运行这个文件中的测试;*   unittest里罕用的6个断言办法请见;*   每实现一个测试,Python都会打印一个字符:*   测试通过打印句点 `.`;*   测试引发谬误打印一个 `E`;*   测试导致断言失败打印一个 `F`;