前言

为什么想起学Python了?

之所以想起学学Python是有三个缘由。从时间顺序上看,首先是在10月中旬,笔者去学校招聘会走了走,发现招Python开发的挺多的,有在线教育、智慧城市等行业,基本以数据挖掘处理为主。其次是10月中旬接到了腾讯微信搜一搜后台的实习面试邀请,那边招C++和Python开发,用的是腾讯自研框架。最后也是最重要的,在11月上旬,笔者参加的电子设计大赛F题送药小车核心点在图像识别,而市面上用的比较多的OpenMV需要用Python开发。这让笔者意识到是时候该学学Python了,虽然说学好一门语言后再学第二门会很简单,但万一遇到紧急项目,总不能再花时间在语法基础上吧,项目所需要的框架也是需要学习成本的。

Python与Java?

笔者对Java比较熟练,也是以Java作为第一门语言开始学习的。有了一定开发经验后最大的感受是确实能快速上手Python,特别是面向对象那块,毕竟编程思想是可以互通的。至于以后会不会从事Python相关的开发工作,要看市场和项目需求,现阶段还是会以Java的学习为重,笔者Java还有好多好多要学的呢,Python暂时学来玩玩刷刷leetcode就好了。

参考资料

笔者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 profile user_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 unittest
    from model_name import function_name class TestCase(unittest.TestCase):
    """测试函数function_name""" def setUp(self):
    """构建前置条件""" def test_function(self):
    run_result = function_name(parameter)
    self.assertEqual(run_result, correct_result) unittest.main()
    • 首先导入模块unittest和被测试方法function_name
    • 然后创建TestCase类,其包含各种具体的单元测试方法。该类继承unittest.TestCase类;
    • setUp()方法的作用是创建前置条件;
    • 编写测试方法test_function,方法名必须以test_打头;
    • 使用断言assertEqual()判断函数执行结果与预期结果的差别;
    • unittest.main()让Python运行这个文件中的测试;
  • unittest里常用的6个断言方法请见《Python常用函数、方法示例总结(API)》

  • 每完成一个测试,Python都会打印一个字符:

    • 测试通过打印句点 .
    • 测试引发错误打印一个 E
    • 测试导致断言失败打印一个 F

最后

新人制作,如有错误,欢迎指出,感激不尽!
欢迎关注公众号,会分享一些更日常的东西!
如需转载,请标注出处!

Python | Python语法基础的更多相关文章

  1. 【PYTHON】语法基础 | 开始使用Python

    Python的热度不言而喻,机器学习.数据分析的首选语言都是Python,想要学习Python的小伙伴也很多,我之前也没有认真用过Python,所以也想体验一下它的魅力,索性花了两天集中看了一下它的基 ...

  2. python基础入门一(语法基础)

    作为自己正式接触并应用的第一门编程语言,在Alex和武sir两位大王的要求下,开始了写博客总结的日子.学习编程语言是很有趣的一件事情,但有2点请一定要谨记:1.做人靠自己,码代码也必须靠自己.能不能成 ...

  3. Python基础:语法基础(3)

    本篇主要介绍Python中一些基础语法,其中包括:标识符.关键字.常量.变量.表达式.语句.注释.模块和包等内容. 1. 标识符和关键字 1.1 标识符 标识符是变量.常量.函数.属性.类.模块和包等 ...

  4. Python3 与 C# 基础语法对比(就当Python和C#基础的普及吧)

      文章汇总:https://www.cnblogs.com/dotnetcrazy/p/9160514.html 多图旧排版:https://www.cnblogs.com/dunitian/p/9 ...

  5. python语法基础笔记

    本篇笔记基于博主自己的的学习,理解,总结所写.很多东西可能存在误解,不能保证百分之百的正确. 1. 数据表达1.1 常量和变量1.2 数据类型1.2.1 基本数据元素1.2.1.1 数字1.2.1.2 ...

  6. (数据分析)第02章 Python语法基础,IPython和Jupyter Notebooks.md

    第2章 Python语法基础,IPython和Jupyter Notebooks 当我在2011年和2012年写作本书的第一版时,可用的学习Python数据分析的资源很少.这部分上是一个鸡和蛋的问题: ...

  7. Python:笔记(1)——基础语法

    Python:笔记(1)——基础语法 我很抱歉有半年没有在博客园写过笔记了,客观因素有一些,但主观原因居多,再多的谴责和批判也都于事无补,我们能做的就是重振旗鼓,继续出发! ——写在Python之前 ...

  8. Python学习①. 基础语法

    Python 简介 Python 是一种解释型,面向对象的语言.特点是语法简单,可跨平台 Python 基础语法 交互式编程 交互式编程不需要创建脚本文件,是通过 Python 解释器的交互模式进来编 ...

  9. Python入门篇-基础语法

    Python入门篇-基础语法 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.编程基础 1>.程序 一组能让计算机识别和执行的指令. 程序 >.算法+ 数据结构= 程 ...

随机推荐

  1. 题解 Wide Swap

    题目传送门 题目大意 给出一个长度为 \(n\) 的排列 \(a_{1,2,...,n}\) 以及常数 \(k\),每次可以交换两个数 \(a_i,a_j\) 当且仅当 \(j-i\ge k \tex ...

  2. C++的智能指针学习笔记(初)

    C++ primer plus 16.2节介绍了auto_ptr,该模板类在C++11中已弃用,目前已被shared_ptr代替. auto_ptr又叫做智能指针,用于管理动态内存分配的用法. 为什么 ...

  3. Golang通脉之包的管理

    在工程化的开发项目中,Go语言的源码复用是建立在包(package)基础之上的. 包(package)是多个Go源码的集合,是一种高级的代码复用方案,Go语言提供了很多内置包,如fmt.os.io等. ...

  4. cookie和session和localStorage的区别

    这三个都是保存在浏览器端,而且都是同源的. Session仅在当前浏览器窗口关闭有效,不能持久保存 Localstorage始终有效,窗口或浏览器关闭也一直保存,因此用作持久数据 Cookie只在设置 ...

  5. 离线状态迁移Anaconda虚拟环境

    离线状态迁移Anaconda虚拟环境 同样是项目需求,需要布署的服务器上的Anaconda安装到了普通账户下 而后续所有的内容都需要通过root账户进行操作,而服务器已经布署,联网比较麻烦 本文提出, ...

  6. Beta-技术规格说明书

    项目 内容 这个作业属于哪个课程 2021春季软件工程(罗杰 任健) 这个作业的要求在哪里 团队项目-计划-功能规格说明书 一.架构与技术栈 1.整体架构 本项目的整体架构如上图所示.下面我们将对涉及 ...

  7. Nginx高效核心

    Nginx高效核心 目录 Nginx高效核心 Introduction I/O特性 同步/异步 阻塞/非阻塞 常见的I/O模型 阻塞型 非阻塞型 多路复用模型(多路阻塞) 信号驱动模型 异步模型 Ng ...

  8. 自定义注解结合切面和spel表达式

    在我们的实际开发中可能存在这么一种情况,当方法参数中的某些条件成立的时候,需要执行一些逻辑处理,比如输出日志.而这些代码可能都是差不多的,那么这个时候就可以结合自定义注解加上切面加上spel表达式进行 ...

  9. NOIP模拟22

    T1d 一道垃圾贪心,写个堆优化或者桶就行 1 #include<bits/stdc++.h> 2 #define int long long 3 using namespace std; ...

  10. 嵌入式单片机stm32之DMA实验

    一. 对于大容量的STM32芯片有2个DMA控制器,控制器1有7个通道,控制器2有5个通道 每个通道都可以配置一些外设的地址. 二. 通道的配置过程: 1. 首先设置CPARx寄存器和CMARx寄存器 ...