二、模拟平台安装和基本使用
三、基于OpenCV的自动驾驶控制
具体效果如下视频所示(第1个是在模拟环境中通过深度学习实现,第2个是真实的使用树莓派搭建的深度学习自动驾驶小车):
基于深度学习的自动驾驶小车
基于纯视觉的端到端自动驾驶小车,使用pytorch和神经网络计算棒实现 完整教程请在csdn上搜索“钱彬的博客 一文掌握基于深度学习的自动驾驶小车开发”
二、模拟平台安装和基本使用
该地址中提供的模拟器是基于Unity开发的,是经过删减过后的可执行程序,不再需要额外安装unity,下载下来后就可以直接运行。目前覆盖windows、Linux、Mac共3个版本。本文为了简单教学,只讲解如何在windows平台上运行和使用该模拟器。
安装好以后我们可以运行下面的python代码来实现小车的控制(注意:运行下面的代码前先启动模拟器,并停留在模拟器主界面上):
读万卷书不如行万里路,捧着所谓的经典论文或者经典书籍死记硬背不如真正的动手实践,遇到问题解决问题,在实践中才能真正的脱胎换骨。
AI这世界,星辰大海,你准备好了吗?
Python是面向对象,高级语言,解释,动态和多用途编程语言。Python易于学习,而且功能强大,功能多样的脚本语言使其对应用程序开发具有吸引力。
Python的语法和动态类型具有其解释性质,使其成为许多领域的脚本编写和快速应用程序开发的理想语言。
Python支持多种编程模式,包括面向对象编程,命令式和函数式编程或过程式编程。
Python几乎无所不能,一些常用的开发领域,如Web编程。这就是为什么它被称为多用途,因为它可以用于网络,企业,3D CAD等软件和系统开发。
在Python中,不需要使用数据类型来声明变量,因为它是动态类型的,所以可以写一个如 a=10
来声明一个变量a
中的值是一个整数类型。
Python使开发和调试快速,因为在python开发中没有包含编译步骤,并且编辑 <-> 测试 <-> 调试循环使用代码开发效率非常高。
Python是一种高级,解释,交互和面向对象的脚本语言。 Python被设计为高度可读性。 它使用英语关键字,而其他语言使用标点符号。它的语法结构比其他语言少。
Python是解释型语言 - Python代码在解释器中运行时处理,执行前不需要编译程序。 这与PERL和PHP类似。
Python是交动的 - 在Python提示符下面直接和解释器进行交互来编写程序。
Python是面向对象的 - Python支持面向对象的风格或编程技术,将代码封装在对象内。
Python是一门初学者的语言 - Python是初学者程序员的伟大语言,并支持从简单的文本处理到WWW浏览器到游戏的各种应用程序的开发。
Python作为一个整体可以用于任何软件开发领域。下面来看看Python可以应用在哪些领域的开发。如下所列 -
Python允许同时为多个变量分配单个值。
这里,创建一个整数对象,其值为1
,并且所有三个变量都分配给相同的内存位置。还可以将多个对象分配给多个变量。 例如 -
这里,将两个值为10
和20
的整数对象分别分配给变量a
和b
,并将一个值为“maxsu
”的字符串对象分配给变量c
。
存储在内存中的数据可以是多种类型。 例如,一个人的年龄可存储为一个数字值,他的地址被存储为字母数字字符串。 Python具有各种标准数据类型,用于定义可能的操作以及每个标准数据类型的存储方法。
Python有五种标准数据类型 -
列表是Python复合数据类型中最多功能的。 一个列表包含用逗号分隔并括在方括号([]
)中的项目。在某种程度上,列表类似于C语言中的数组。它们之间的区别之一是Python列表的所有项可以是不同的数据类型,而C语言中的数组只能是同种类型。
存储在列表中的值可以使用切片运算符([]
和[]
)来访问,索引从列表开头的0
开始,并且以-1
表示列表中的最后一个项目。 加号(+
)是列表连接运算符,星号(*
)是重复运算符。例如 -
元组是与列表非常类似的另一个序列数据类型。元组是由多个值以逗号分隔。然而,与列表不同,元组被括在小括号内(()
)。
列表和元组之间的主要区别是 - 列表括在括号([]
)中,列表中的元素和大小可以更改,而元组括在括号(()
)中,无法更新。元组可以被认为是只读列表。 例如 -
以下代码对于元组无效,因为尝试更新元组,但是元组是不允许更新的。类似的情况可能与列表 -
Python的字典是一种哈希表类型。它们像Perl中发现的关联数组或散列一样工作,由键值对组成。字典键几乎可以是任何Python数据类型,但通常为了方便使用数字或字符串。另一方面,值可以是任意任意的Python对象。
字典由大括号({}
)括起来,可以使用方括号([]
)分配和访问值。例如 -
字典中的元素没有顺序的概念。但是说这些元素是“乱序”是不正确的; 它们是无序的。
有时,可能需要在内置类型之间执行转换。要在类型之间进行转换,只需使用类型名称作为函数即可。
有以下几种内置函数用于执行从一种数据类型到另一种数据类型的转换。这些函数返回一个表示转换值的新对象。它们分别如下所示 -
将x 转换为整数。如果x 是字符串,则要base 指定基数。
|
将对象x 转换为字符串表示形式。
|
将对象x 转换为表达式字符串。
|
评估求值一个字符串并返回一个对象。 |
创建一个字典,d 必须是(key,value) 元组的序列
|
将整数x 转换为Unicode字符。
|
将单个字符x 转换为其整数值。
|
将整数x 转换为十六进制字符串。
|
将整数x 转换为八进制字符串。
|
运算符是可以操纵操作数值的结构。如下一个表达式:10 + 20 = 30
。这里,10
和20
称为操作数,+
则被称为运算符。
Python语言支持以下类型的运算符 -
下面让我们依次来看看所有的运算符。
假设变量a
的值是10
,变量b
的值是21
,则 -
加法运算,将运算符两边的操作数增加。 |
减法运算,将运算符左边的操作数减去右边的操作数。 |
乘法运算,将运算符两边的操作数相乘 |
除法运算,用右操作数除左操作数 |
模运算,用右操作数除数左操作数并返回余数 |
对运算符进行指数(幂)计算 |
地板除 - 操作数的除法,其结果是删除小数点后的商数。 但如果其中一个操作数为负数,则结果将被保留,即从零(向负无穷大)舍去 |
有关算术运算符的示例代码,请参考::
比较(关系)运算符比较它们两边的值,并确定它们之间的关系。它们也称为关系运算符。假设变量a
的值10
,变量b
的值是20
,则 -
如果两个操作数的值相等,则条件为真。 |
如果两个操作数的值不相等,则条件为真。 |
如果左操作数的值大于右操作数的值,则条件成为真。 |
如果左操作数的值小于右操作数的值,则条件成为真。 |
如果左操作数的值大于或等于右操作数的值,则条件成为真。 |
如果左操作数的值小于或等于右操作数的值,则条件成为真。 |
有关比较(关系)运算符的示例代码,请参考:
假设变量a
的值10
,变量b
的值是20
,则 -
将右侧操作数的值分配给左侧操作数 |
将右操作数相加到左操作数,并将结果分配给左操作数 |
从左操作数中减去右操作数,并将结果分配给左操作数 |
将右操作数与左操作数相乘,并将结果分配给左操作数 |
将左操作数除以右操作数,并将结果分配给左操作数 |
将左操作数除以右操作数的模数,并将结果分配给左操作数 |
执行指数(幂)计算,并将值分配给左操作数 |
运算符执行地板除运算,并将值分配给左操作数 |
有关赋值运算符的示例代码,请参考:
Python语言支持以下逻辑运算符。假设变量a
的值为True
,变量b
的值为False
,那么 -
如果两个操作数都为真,则条件成立。 |
如果两个操作数中的任何一个非零,则条件成为真。 |
用于反转操作数的逻辑状态。 |
有关逻辑运算符的示例代码,请参考:
按位运算符执行逐位运算。 假设变量a = 60
; 和变量b = 13
; 现在以二进制格式,它们将如下 -
Python的内置函数bin()
可用于获取整数的二进制表示形式。
以下是Python语言支持位运算操作符 -
有关按位运算符的示例代码,请参考:
Python成员运算符测试给定值是否为序列中的成员,例如字符串,列表或元组。 有两个成员运算符,如下所述 -
如果在指定的序列中找到一个变量的值,则返回true ,否则返回false 。
|
如果在指定序列中找不到变量的值,则返回true ,否则返回false 。
|
有关成员运算符的示例代码,请参考:
身份运算符比较两个对象的内存位置。常用的有两个身份运算符,如下所述 -
如果运算符任一侧的变量指向相同的对象,则返回True ,否则返回False 。
|
如果运算符任一侧的变量指向相同的对象,则返回True ,否则返回False 。
|
有关身份运算符的示例代码,请参考:
下表列出了从最高优先级到最低优先级的所有运算符,如下所示 -
补码,一元加减(最后两个的方法名称是+@ 和-@ )
|
乘法,除法,模数和地板除 |
按位异或和常规的“OR ”
|
有关运算符优先级的示例代码,请参考:
决策是指在执行程序期间根据发生的情况并根据条件采取的具体操作(行动)。决策结构评估求值多个表达式,产生TRUE
或FALSE
作为结果。如果结果为TRUE
或否则为FALSE
,则需要确定要执行的操作和要执行的语句。
以下是大多数编程语言中的典型决策结构的一般形式 -
Python编程语言假定任何非零值和非空值都为TRUE
值,而任何零值或空值都为FALSE
值。
Python编程语言提供以下类型的决策语句。
一个if语句由一个布尔表达式,后跟一个或多个语句组成。 |
一个if 语句可以跟随一个可选的else 语句,当if 语句的布尔表达式为FALSE 时,则else 语句块将被执行。
|
可以在一个if 或else 语句中使用一个if 或else if 语句。
|
下面我们快速地来了解每个决策声明。
一个if
子句套件可能只包含一行,它可能与头语句在同一行上。
以下是一行if
子句的示例 -
当执行上述代码时,会产生以下结果 -
一般来说,语句依次执行 - 例如,函数中的第一个语句首先执行,然后是第二个语句,依次类推。但是有很多时候需要多次执行同一段代码,这就引入了循环的概念。
编程语言提供了允许更复杂的执行路径的各种控制结构。
循环语句允许多次执行语句或语句组。下图说明了一个循环语句流程结构 -
Python编程语言提供以下类型的循环来处理循环需求。
在给定条件为TRUE 时,重复一个语句或一组语句。 它在执行循环体之前测试状态。
|
多次执行一系列语句,并缩写管理循环变量的代码。 |
可以使用一个或多个循环在while 或for 循环中。
|
循环控制语句从正常顺序更改执行。 当执行离开范围时,在该范围内创建的所有自动对象都将被销毁。
Python支持以下控制语句。
终止循环语句并将执行转移到循环之后的语句。 |
使循环跳过其主体的剩余部分,并立即重新测试其状态以进入下一次迭代。 |
当语法需要但不需要执行任何命令或代码时,Python中就可以使用pass 语句,此语句什么也不做,用于表示“占位”的代码,有关实现细节后面再写
|
下面简单地看一下循环控制语句。
迭代器(Iterator)是允许程序员遍历集合的所有元素的对象,而不管其具体实现。在Python中,迭代器对象实现了iter()
和next()
两种方法。
发生器(generator
)是使用yield
方法产生或产生一系列值的函数。
当一个生成器函数被调用时,它返回一个生成器对象,而不用执行该函数。 当第一次调用next()
方法时,函数开始执行,直到它达到yield
语句,返回yielded
值。 yield
保持跟踪,即记住最后一次执行,而第二个next()
调用从前一个值继续。
以下示例定义了一个生成器,它为所有斐波纳契数字生成一个迭代器。
数字数据类型用于存储数值。它们是不可变数据类型。这意味着,更改数字数据类型的值会导致新分配对象。
当为数字数据类型分配值时,Python将创建数字对象。 例如 -
可以使用del
语句删除对数字对象的引用。del
语句的语法是 -
可以使用del
语句一次删除单个对象或多个对象。 例如 -
Python支持不同的数值类型 -
int(有符号整数) - 它们通常被称为整数或整数。它们是没有小数点的正或负整数。 Python 3中的整数是无限大小的。 Python 2 有两个整数类型 - int
和long
。 Python 3中没有“长整数”。
float(浮点实数值) - 也称为浮点数,它们表示实数,并用小数点写整数和小数部分。 浮点数也可以是科学符号,E
或e
表示10
的幂 -
bJ的形式,其中a
和b
是浮点,J
(或j
)表示-1
的平方根(虚数)。数字的实部是a
,虚部是b
。复数在Python编程中并没有太多用处。
可以以十六进制或八进制形式表示整数 -
以下是一些数字值的示例 -
复数由一个a + bj
来表示,它是由实际浮点数的有序对组成,其中a
是实部,b
是复数的虚部。
Python可将包含混合类型的表达式内部的数字转换成用于评估求值的常用类型。 有时需要从一个类型到另一个类型执行明确数字转换,以满足运算符或函数参数的要求。
int(x)
将x
转换为纯整数。
complex(x)
将x
转换为具有实部x
和虚部0
的复数。
complex(x, y)
将x
和y
转换为具有实部为x
和虚部为y
的复数。x
和y
是数字表达式。
Python中包括执行数学计算的函数,如下列表所示 -
随机数字用于游戏,模拟,测试,安全和隐私应用。 Python包括以下通常使用的函数。
随机数字用于游戏,模拟,测试,安全和隐私应用。 Python包括以下通常使用的函数。
该模块还定义了两个数学常数 -
字符串是Python中最受欢迎、最常使用的数据类型。可以通过用引号括起字符来创建它们。 Python将单引号与双引号相同。创建字符串和向一个变量赋值一样简单。 例如 -
Python不支持字符类型; 字符会被视为长度为1
的字符串,因此也被认为是一个子字符串。要访问子串,请使用方括号的切片加上索引或直接使用索引来获取子字符串。 例如 -
当执行上述代码时,会产生以下结果 -
可以通过将变量分配给另一个字符串来“更新”现有的字符串。 新值可以与其原值相关或完全不同的字符串。 例如 -
当执行上述代码时,会产生以下结果 -
下表是可以用反斜杠表示法表示转义或不可打印字符的列表。单引号以及双引号字符串的转义字符被解析。
八进制符号,其中n 在0.7范围内
|
十六进制符号,其中n 在0~9 ,a~f 或A~F 范围内
|
假设字符串变量a
保存字符串值’Hello
‘,变量b
保存字符串值’Python
‘,那么 -
连接 - 将运算符的两边的值添加 | |
重复 - 创建新字符串,连接相同字符串的多个副本 | |
切片 - 给出指定索引中的字符串值,它是原字符串的子串。 | |
范围切片 - 给出给定范围内的子字符串 | |
成员关系 - 如果给定字符串中存在指定的字符,则返回true
|
|
成员关系 - 如果给定字符串中不存在指定的字符,则返回true
|
|
原始字符串 - 抑制转义字符的实际含义。原始字符串的语法与正常字符串的格式完全相同,除了原始字符串运算符在引号之前加上字母“r ”。 “r ”可以是小写(r )或大写(R ),并且必须紧靠在第一个引号之前。
|
print(r'\n') 将打印 \n ,或者 print(R'\n') 将打印 \n ,要注意的是如果不加r 或R 作为前缀,打印的结果就是一个换行。
|
格式 - 执行字符串格式化 |
Python最酷的功能之一是字符串格式运算符%
。 这个操作符对于字符串是独一无二的,弥补了C语言中 printf()
系列函数。 以下是一个简单的例子 -
当执行上述代码时,会产生以下结果 -
以下是可以与%
符号一起使用的完整符号集列表 -
在格式化之前通过str() 函数转换字符串
|
十六进制整数(小写字母) |
十六进制整数(大写字母) |
指数符号(小写字母’e ‘)
|
指数符号(大写字母’E ‘
|
其他支持的符号和功能如下表所列 -
根据是否使用“x ”或“X ”,添加八进制前导零(‘0 ‘)或十六进制前导’0x ‘或’0X ‘。
|
|
0
|
使用零作为左边垫符(而不是空格) |
‘%% ‘留下一个文字“% ”
|
|
m 是最小总宽度,n 是小数点后显示的位数(如果应用)
|
Python中的三重引号允许字符串跨越多行,包括逐字记录的新一行,TAB
和任何其他特殊字符。
三重引号的语法由三个连续的单引号或双引号组成。
当执行上述代码时,会产生以下结果。注意每个单独的特殊字符如何被转换成其打印形式,它是直到最后一个NEWLINEs
在“up
”之间的字符串的末尾,并关闭三重引号。 另请注意,NEWLINEs
可能会在一行或其转义码(\n
)的末尾显式显示回车符 -
原始字符串根本不将反斜杠视为特殊字符。放入原始字符串的每个字符都保持所写的方式 -
当执行上述代码时,会产生以下结果 -
现在演示如何使用原始的字符串。将表达式修改为如下 -
当执行上述代码时,会产生以下结果 -
在Python 3中,所有的字符串都用Unicode表示。在Python 2内部存储为8
位ASCII,因此需要附加’u
‘使其成为Unicode,而现在不再需要了。
Python包括以下内置方法来操作字符串 -
把字符串的第一个字母转为大写 |
返回使用fillchar 填充的字符串,原始字符串以总共width 列为中心。
|
计算字符串中出现有多少次str 或字符串的子字符串(如果开始索引beg 和结束索引end ,则在beg ~end 范围匹配)。
|
使用编码encoding 解码该字符串。 编码默认为默认字符串encoding 。
|
返回字符串的编码字符串版本; 在错误的情况下,默认是抛出ValueError ,除非使用’ignore ‘或’replace ‘给出错误。
|
确定字符串或字符串的子字符串(如果启动索引结束和结束索引结束)都以后缀结尾; 如果是则返回true ,否则返回false 。
|
将字符串中的制表符扩展到多个空格; 如果没有提供tabize ,则默认为每个制表符为8 个空格。
|
如果索引beg 和结束索引end 给定,则确定str 是否在字符串或字符串的子字符串中,如果找到则返回索引,否则为-1 。
|
与find() 相同,但如果没有找到str ,则引发异常。
|
如果字符串至少包含1 个字符,并且所有字符均为数字,则返回true ,否则返回false 。
|
如果字符串至少包含1 个字符,并且所有字符均为字母,则返回true ,否则返回false 。
|
如果字符串只包含数字则返回true ,否则返回false 。
|
如果字符串至少包含1 个字母,并且所有字符均为小写,则返回true ,否则返回false 。
|
如果unicode 字符串只包含数字字符,则返回true ,否则返回false 。
|
如果字符串只包含空格字符,则返回true ,否则返回false 。
|
如果字符串正确“标题大小写”,则返回true ,否则返回false 。
|
如果字符串至少包含一个可变大小写字符,并且所有可变大小写字符均为大写,则返回true ,否则返回false 。
|
将序列seq 中的元素以字符串表示合并(并入)到具有分隔符字符串的字符串中。
|
返回一个空格填充的字符串,原始字符串左对齐到总共width 列。
|
将字符串中的所有大写字母转换为小写。 |
删除字符串中的所有前导空格 |
返回在translate 函数中使用的转换表。
|
从字符串str 返回最大字母字符。
|
如果给定max 值,则用new 或最多最大出现替换字符串中所有出现的旧字符(old )。
|
与index() 相同,但在字符串中向后搜索。
|
返回一个空格填充字符串,原始字符串右对齐到总共宽度(width )列。
|
删除字符串的所有尾随空格。 |
根据分隔符str (空格,如果没有提供)拆分字符串并返回子字符串列表; 如果给定,最多分割为num 子串。
|
全部拆分字符串(或num )新行符,并返回每行的列表,并删除新行符。
|
确定字符串或字符串的子字符串(如果给定起始索引beg 和结束索引end )以str 开头; 如果是则返回true ,否则返回false 。
|
反转在字符串中的所有字母大小写,即小写转大写,大写转小写。 |
返回字符串的标题版本,即所有单词第一个字母都以大写开头,其余的都是小写的。 |
根据转换表STR(256个字符),除去那些在del 字符串转换字符串。
|
将字符串中的小写字母转换为大写。 |
返回原始字符串,左边填充为零,总共有宽度(width )字符; 对于数字zfill() 保留给定的任何符号(少于一个零)。
|
如果unicode字符串只包含十进制字符,则返回true ,否则返回false 。
|
Python中最基本的数据结构是列表。一个列表的每个元素被分配一个数字来表示它的位置或索引。 第一个索引为0
,第二个索引为1
,依此类推。
Python有六种内置的序列类型,但最常见的是列表和元组,将在本教程中看到。
可以在列表上执行各种类型操作。这些操作包括索引,切片,添加,乘法和检查成员身份。此外,Python还具有内置函数,用于查找序列的长度和查找其最大和最小的元素。
列表是Python中最通用的数据类型,可以写成方括号之间的逗号分隔值(项)列表。列表中的项目不必是相同的类型,这一点和C语言中数组有差别。
创建列表就在方括号之间放置不同的逗号分隔值。 例如 -
类似于字符串索引,列表索引从0
开始,列表可以被切片,连接等等。
要访问列表中的值,使用方括号进行切片以及索引或索引,以获取该索引处可用的值。例如 -
当执行上述代码时,会产生以下结果 -
可以通过在分配运算符左侧给出切片来更新列表的单个或多个元素,可以使用append()
方法添加到列表中的元素。例如 -
注 - 在后续章节中讨论了
append()
方法。
当执行上述代码时,会产生以下结果 -
要删除列表元素,并且如果确切知道要删除哪些元素可以使用del
语句。如果不知道要删除哪些项目,可以使用remove()
方法。 例如 -
当执行上述代码时,会产生以下结果 -
注 -
remove()
方法将在后续章节中讨论。
列表响应+
和*
运算符,这与字符串十分类似; 它们也意味着这里的连接和重复,除了结果是新的列表,而不是字符串。
事实上,列表响应上一章中,在字符串上使用的所有常规序列操作。
由于列表是序列,索引和切片的工作方式与列表一样,对于字符串。
Python包括以下列表函数功能 -
元组是一系列不可变的Python对象。元组是一种序列,就像列表一样。元组和列表之间的主要区别是元组不能像列表那样改变元素的值,可以简单地理解为“只读列表”。 元组使用小括号 - ()
,而列表使用方括号 - []
。
创建一个元组只需使用逗号分隔值放入小括号的一个序列。 或者,也可以将这些逗号分隔值放在括号之间。 例如 -
空的元组写成两个不含任何东西的小括号 -
要编写一个包含单个值的元组,必须包含一个逗号,即使只有一个值(这是规范写法) -
要访问元组中的值,请使用方括号进行指定索引切片或索引,以获取该索引处的值。 例如 -
当执行上述代码时,会产生以下结果 -
元组是不可变的,这意味着我们无法更新或更改元组元素的值。 但是可以使用现有元组的一部分来创建新的元组,如下例所示:
当执行上述代码时,会产生以下结果 -
删除单个元组元素是不可能的。 当然,将不必要的元素放在另一个元组中也没有什么错。
要显式删除整个元组,只需使用del
语句。 例如 -
执行上面代码,将产生以下结果 -
注 - 引发异常。这是因为在
del tup
之后,元组不再存在。
元组响应+
和*
运算符很像字符串; 它们执行连接和重复操作,但结果是一个新的元组,而不是一个字符串。
事实上,元组中类似字符串操作和使用的所有常规序列操作都有作了讲解。
由于元组是序列,索引和切片的工作方式与列表的工作方式相同,假设输入以下值:
每个键与其值使用一个冒号(:
)分开,这些键-值对是使用逗号分隔的,整个字典项目用大括号括起来。 没有任何项目的空字典只用两个花括号写成:{}
键在字典中是唯一的,而值可以不必是唯一的。字典的值可以是任何类型的,但是键必须是不可变的数据类型,例如字符串,数字或元组。
要访问字典元素,可以使用熟悉的中括号以及键来获取其值。 以下是一个简单的例子 -
当执行上述代码时,会产生以下结果 -
如果尝试使用键(不是字典的一部分)访问数据项,会收到以下错误,如下示例 -
当执行上述代码时,会产生以下结果 -
可以通过添加新数据项或键值对,修改现有数据项或删除现有数据项来更新字典,如下面给出的简单示例所示。
当执行上述代码时,会产生以下结果 -
可以删除单个字典元素或清除字典的全部内容。也可以在单个操作中删除整个字典。
要显式删除整个字典,只需使用del
语句。 以下是一个简单的例子 -
这产生以下结果:程序抛出了一个例外,因为在执行del dict
之后,字典不再存在。
注 -
del()
方法将在后续章节中讨论。
字典值没有限制。它们可以是任意任意的Python对象,标准对象或用户定义的对象。 但是,对于键来说也是如此。
关于字典的键有两个要点:
(a). 不允许每键多于数据值。这意味着不允许重复的键。 在分配过程中遇到重复键时,则以最后一个赋值为准。 例如 -
当执行上述代码时,会产生以下结果 -
(b). 键必须是不可变的。 这意味着可以使用字符串,数字或元组作为字典键,但不允许使用['key']
。 以下是一个简单的例子 -
当执行上述代码时,会产生以下结果 -
计算出字典的总长度。它将等于字典中的数据项数目。 |
生成字典的可打印字符串表示形式 |
返回传递变量的类型。如果传递变量是字典,那么它将返回一个字典类型。 |
Python程序可以通过多种方式处理日期和时间。日期格式之间的转换是计算机常见问题。Python的时间(time
)和日历(calendar
)模块可用于跟踪日期和时间。
Python中有提供与日期和时间相关的4
个模块。它们分别是 -
time 是一个仅包含与日期和时间相关的函数和常量的模块,在本模块中定义了C/C++ 编写的几个类。 例如,struct_time 类。
|
datetime 是一个使用面向对象编程设计的模块,可以在Python中使用日期和时间。它定义了几个表示日期和时间的类。
|
日历是一个提供函数的模块,以及与Calendar 相关的几个类,它们支持将日历映像生成为text,html,….
|
该模块包含用于格式化或基于区域设置分析日期和时间的函数。 |
时间间隔是以秒为单位的浮点数。 从1970年1月1日上午12:00(epoch),这是一种时间的特殊时刻表示。
在Python中,当前时刻与上述特殊的某个时间点之间以秒为单位的时间。这个时间段叫做Ticks。
time
模块中的time()
函数返回从1970年1月1日上午12点开始的秒数。
执行上面代码,得到以下结果 -
但是,这个形式不能表示在时代(1970年1月1日上午12:00)之前的日期。在未来的日子也不能以这种方式表示 - 截止点是在2038
年的UNIX和Windows的某个时刻。
许多Python时间函数将时间处理为9
个数字的元组,如下所示:
0 |
上面的元组相当于struct_time
结构。此结构具有以下属性 -
0 |
能用图片说明白的尽量用图片说明 -
要将从时间浮点值开始的秒数瞬间转换为时间序列,将浮点值传递给返回具有所有有效九个项目的时间元组的函数(例如本地时间)。
执行上面代码,这将产生如下结果 -
可以根据需要格式化任何时间,但也可使用可读格式获取时间的简单方法是 - asctime()
-
执行上面代码,这将产生如下结果 -
calendar
模块提供了广泛的方法来显示年历和月度日历。 在这里,将打印一个给定月份的日历(2021年11月) -
执行上面代码后,将输出以下结果 -
Python中有一个受欢迎的时间(time
)模块,它提供了处理时间和表示之间转换的功能。以下是所有时间(time
)可用方法的列表。
时间(time
)模块有两个重要的属性可用。它们是 -
属性time.timezone 是UTC和本地时区(不含DST)之间的偏移量(美洲为 > 0 ,欧洲,亚洲,非洲大部分地区为 0 )。
|
属性time.tzname 是一对与区域相关的字符串,它们分别是没有和具有DST的本地时区的名称。
|
calendar
模块提供与日历相关的功能,包括为给定的月份或年份打印文本日历的功能。
默认情况下,日历将星期一作为一周的第一天,将星期日作为最后一天。 如果想要更改这个,可调用calendar.setfirstweekday()
函数设置修改。
以下是calendar
模块可用的功能函数列表 -
返回一个具有年份日历的多行字符串格式化为三列,以c 个空格分隔。 w 是每个日期的字符宽度; 每行的长度为21 * w + 18 + 2 * c ,l 是每周的行数。
|
返回当前设置每周开始的星期。默认情况下,当日历首次导入时设置为:0 ,表示为星期一。
|
如果给定年份(year )是闰年则返回True ; 否则返回:False 。
|
返回在范围(y1,y2) 内的年份中的闰年总数。
|
返回一个多行字符串,其中包含年份月份的日历,每周一行和两个标题行。 w 是每个日期的字符宽度; 每行的长度为7 * w + 6 。 l 是每周的行数。
|
返回int 类型的列表。每个子列表表示一个星期。年份月份以外的天数设置为0 ; 该月内的日期设定为月份的第几日:1 ~ 31。
|
返回两个整数。第一个是年度月(month )的星期几的代码; 第二个是当月的天数。表示星期几为0 (星期一)至6 (星期日); 月份是1 到12 。
|
将每周的第一天设置为星期几的代码。 星期几的代码为0 (星期一)至6 (星期日)。
|
time.gmtime 的倒数:以时间元组的形式接受时刻,并返回与从时代(epoch )开始的浮点数相同的时刻。
|
返回给定日期的星期几的代码。星期几的代码为0 (星期一)至6 (星期日); 月数是1 (1月)到12 (12月)。
|
如果您有兴趣,那么可以在Python中找到其他重要的模块和功能列表,其中包含日期和时间。以下列出其它有用的模块 -
函数是一个有组织,可重复使用的代码块,用于执行单个相关操作。 函数为应用程序提供更好的模块化和高度的代码重用。
我们知道,Python中也有给很多内置的函数,如print()
等,但用户也可以创建自己的函数。这样的函数称为用户定义函数。
可以定义提供所需函数的功能。 以下是在Python中定义函数的简单规则。
def
开头,后跟函数名和小括号(()
)。
:
)开始,并缩进。
docstring
字符串。
return [expression]
用于退出一个函数,可选地将一个表达式传回给调用者。如果没有使用参数的return
语句,则它与return None
相同。
默认情况下,参数具有位置行为,您需要按照定义的顺序通知它们或调用它们。
以下函数将字符串作为输入参数,并在标准屏幕上打印参数的值。
定义一个函数需要为它起一个名字,指定要包括在函数中的参数并构造代码块。
当函数的基本结构完成,可以通过从另一个函数调用它或直接从Python提示符执行它。 以下是一个调用print_str()
函数的例子 -
当执行上述代码时,会产生以下结果 -
Python语言中的所有参数(参数)都将通过引用传递。如果在函数中更改参数所指的内容,则更改也会反映在调用函数的外部。 例如 -
在这里,将保持对传递对象的引用并在相同的对象中赋值。 因此,这将产生以下结果 -
在上面的输出结果中,可以清楚地看到,mylist[2]
的值原来只在函数内赋了一个值:50
,但在函数外部的最后一个语句打出来的值是:50
,这说明更改也会反映在调用函数的外部。
还有一个例子:参数通过引用传递,引用在被调用函数内被覆盖。
参数mylist
是changeme()
函数的局部变量。在函数中更改mylist
不影响mylist
的值。函数执行完成后,最终将产生以下结果 -
可以使用以下类型的形式参数来调用函数 -
必需参数是以正确的位置顺序传递给函数的参数。这里,函数调用中的参数数量应与函数定义完全一致。
如下示例中,要调用printme()
函数,则必需要传递一个参数,否则会出现如下语法错误 -
当执行上述代码时,会产生以下结果 -
关键字参数与函数调用有关。 在函数调用中使用关键字参数时,调用者通过参数名称来标识参数。
这允许跳过参数或将其置于无序状态,因为Python解释器能够使用提供的关键字将值与参数进行匹配。还可以通过以下方式对printme()
函数进行关键字调用 -
当执行上述代码时,会产生以下结果 -
以下示例给出了更清晰的映射。请注意,参数的顺序并不重要。
当执行上述代码时,会产生以下结果 -
如果在该参数的函数调用中没有提供值,则默认参数是一个假设为默认值的参数。 以下示例给出了默认参数的想法,如果未通过,则打印默认年龄(age
) -
当执行上述代码时,会产生以下结果 -
在定义函数时,可能需要处理更多参数的函数。这些参数被称为可变长度参数,并且不像要求的和默认的参数那样在函数定义中命名。
具有非关键字变量参数的函数的语法如下:
星号(*
)放在保存所有非关键字变量参数值的变量名之前。 如果在函数调用期间没有指定额外的参数,则此元组保持为空。以下是一个简单的例子 -
当执行上述代码时,会产生以下结果 -
这些函数被称为匿名的,因为它们没有使用def
关键字以标准方式声明。可以使用lambda
关键字创建小型匿名函数。
Lambda
表单可以接受任意数量的参数,但只能以表达式的形式返回一个值。它们不能包含命令或多个表达式。
lambda
需要一个表达式。
Lambda
函数有自己的本地命名空间,不能访问其参数列表和全局命名空间中的变量。
lambdas
是一个单行版本的函数,但它们并不等同于C
或C++
中的内联语句,其目的是通过传递函数来进行堆栈分配。
lambda
函数的语法只包含一个语句,如下所示:
以下是一个示例,以显示lambda
形式的函数如何工作 -
当执行上述代码时,会产生以下结果 -
下面给出的所有例子都没有返回任何值。可以从函数返回值,如下所示:
全部执行上述代码时,会产生以下结果 -
程序中的所有变量在该程序的所有位置可能无法访问。这取决于在哪里声明一个变量。变量的范围决定了可以访问特定标识符的程序部分。Python中有两个变量的基本范围 -
在函数体内定义的变量具有局部作用域,外部定义的变量具有全局作用域。
局部变量只能在它们声明的函数内部访问,而全局变量可以通过所有函数在整个程序体中访问。 当调用一个函数时,它内部声明的变量被带入范围。 以下是一个简单的例子 -
当执行上述代码时,会产生以下结果 -
模块允许逻辑地组织Python代码。 将相关代码分组到一个模块中,使代码更容易理解和使用。 模块是一个具有任意命名属性的Python对象,可以绑定和引用。
简单来说,模块是一个由Python代码组成的文件。模块可以定义函数,类和变量。 模块还可以包括可运行的代码。
下面是一个名称为aname
的模块的Python代码通常位于一个名称为aname.py
的文件中。以下是一个简单模块的例子:support.py
-
可以通过在其他Python源文件中执行import
语句来将任何Python源文件用作模块。导入具有以下语法 -
当解释器遇到导入语句时,如果模块存在于搜索路径中,则导入该模块。搜索路径是导入模块之前解释器搜索的目录的列表。例如,要导入模块hello.py
,需要将以下命令放在脚本的顶部 -
当执行上述代码时,会产生以下结果 -
不管模块被导入多少次,模块只能加载一次。这样可以防止模块执行重复发生,如果有多个导入。
Python from
语句允许将模块中的特定属性导入到当前的命名空间中。 from...import
具有以下语法 -
例如,要从模块 fib
导入函数fibonacci
,请使用以下语句 -
此语句不会将整个模块fib
导入到当前命名空间中; 它只是将fibonacci
从模块fib
引入导入模块的全局符号表。
也可以使用以下import
语句将模块中的所有名称导入到当前命名空间中 -
这提供了将所有项目从模块导入到当前命名空间中的简单方法; 但是,这个说法应该谨慎使用。
在模块中,模块的名称(作为字符串)可用作全局变量__name__
的值。模块中的代码将被执行,就像您导入它一样,但是__name__
设置为“__main__
”。
在模块的最后添加这个代码 -
运行上述代码时,将显示以下输出。
当导入模块时,Python解释器将按以下顺序搜索模块 -
PYTHONPATH
中搜索每个目录。
模块搜索路径作为sys.path
变量存储在系统模块sys
中。sys.path
变量包含当前目录PYTHONPATH
和依赖于安装的默认值。
变量是映射到对象的名称(标识符)。 命名空间是变量名(键)及其对应对象(值)的字典。
global
语句。
例如,在全局命名空间中定义一个变量Money
。 在函数Money
中为Money
赋值,因此Python将Money
作为局部变量。
但是,如果在设置之前就访问了本地变量Money
的值,它会产生一个错误:UnboundLocalError
。 这里可以通过取消注释global
语句来解决问题。如下示例代码 -
dir()
内置函数返回一个包含由模块定义的名称的字符串的排序列表。这个列表包含模块中定义的所有模块,变量和函数的名称。 以下是一个简单的例子 -
当执行上述代码时,会产生以下结果 -
这里,特殊的字符串变量__name__
是模块的名称,__file__
是加载模块的文件名。
globals()
和locals()
函数可用于返回全局和本地命名空间中的名称,具体取决于它们被调用的位置。
locals()
从一个函数中调用,它将返回从该函数本地访问的所有名称。
globals()
,它将返回从该函数全局访问的所有名称。
这两个函数的返回类型是字典。 因此,可以使用keys()
函数提取名称。
当将模块导入到脚本中时,模块的顶级部分的代码只能执行一次。
因此,如果要重新执行模块中的顶级代码,可以使用reload()
函数。reload()
函数再次导入以前导入的模块。 reload()
函数的语法是这样的 -
这里,module_name
是要重新加载的模块的名称,而不是包含模块名称的字符串。 例如,要重新加载hello
模块,请执行以下操作 -
Python中的包是一个分层文件目录结构,它定义了一个由模块和子包和子子包组成的Python应用程序环境,等等。
在package
目录中创建两个目录:pkg
和pkg2
, 然后分别在这两个目录中创建两个文件:a.py
和b.py
。该文件具有以下一行源代码 -
在package
目录中创建一个主程序文件:main.py
,用于演示如何调用包中的各个文件 -
整个代码的目录如下所示 -
当执行上述代码时,会产生以下结果 -
在上面的例子中,将每个文件中的一个函数作为示例,但是可以在文件中编写多个函数。还可以在这些文件中定义不同的Python类,然后可以使用这些类来创建包。
在本章中将介绍Python 3中可用的所有基本文件读取I/O功能。有关更多功能,请参考标准Python文档。
产生输出的最简单方法是使用print
语句,可以传递零个或多个由逗号分隔的表达式。此函数将传递的表达式转换为字符串,并将结果写入标准输出,如下所示:
执行上面代码后,将在标准屏幕上产生以下结果 -
Python是世界上最牛逼的语言, 难道不是吗?
Python 2有两个内置的函数用于从标准输入读取数据,默认情况下来自键盘。这两个函数分别是:input()
和raw_input()
。
在Python 3中,不建议使用raw_input()
函数。 input()
函数可以从键盘读取数并作为字符串类型,而不管它是否用引号括起来(“或”“)。
在前面我们学习读取和写入标准的输入和输出。 现在,来看看如何使用实际的数据文件。Python提供了默认操作文件所必需的基本功能和方法。可以使用文件对象执行大部分文件操作。
在读取或写入文件之前,必须使用Python的内置open()
函数打开文件。此函数创建一个文件对象,该对象将用于调用与其相关联的其他支持方法。
这里是参数详细信息 -
file_name
参数是一个字符串值,指定要访问的文件的名称。
access_mode
确定文件打开的模式,即读取,写入,追加等。可能的值的完整列表如下表所示。 这是一个可选参数,默认文件访问模式为(r
- 也就是只读)。
buffering
为1
,则在访问文件时执行行缓冲。如果将缓冲值buffering
指定为大于1
的整数,则使用指定的缓冲区大小执行缓冲操作。如果为负,则缓冲区大小为系统默认值(默认行为)。
以下是打开文件使用的模式的列表 -
打开的文件为只读模式。文件指针位于文件的开头,这是默认模式。 |
打开仅用二进制格式读取的文件。文件指针位于文件的开头,这是默认模式。 |
打开读写文件。文件指针放在文件的开头。 |
以二进制格式打开一个用于读写文件。文件指针放在文件的开头。 |
打开仅供写入的文件。 如果文件存在,则覆盖该文件。 如果文件不存在,则创建一个新文件进行写入。 |
打开仅用二进制格式写入的文件。如果文件存在,则覆盖该文件。 如果文件不存在,则创建一个新文件进行写入。 |
打开写入和取读的文件。如果文件存在,则覆盖现有文件。 如果文件不存在,创建一个新文件进行阅读和写入。 |
打开一个二进制格式的写入和读取文件。 如果文件存在,则覆盖现有文件。 如果文件不存在,创建一个新文件进行阅读和写入。 |
打开一个文件进行追加。 如果文件存在,则文件指针位于文件末尾。也就是说,文件处于追加模式。如果文件不存在,它将创建一个新文件进行写入。 |
打开一个二进制格式的文件。如果文件存在,则文件指针位于文件末尾。 也就是说,文件处于追加模式。如果文件不存在,它将创建一个新文件进行写入。 |
打开一个文件,用于追加和阅读。 如果文件存在,则文件指针位于文件末尾。 文件以附加模式打开。 如果文件不存在,它将创建一个新文件进行阅读和写入。 |
打开一个二进制格式的附加和读取文件。 如果文件存在,则文件指针位于文件末尾。文件以附加模式打开。如果文件不存在,它将创建一个新文件进行读取和写入。 |
打开一个文件并且有一个文件对象后,可以获得与该文件相关的各种信息。
以下是与文件对象相关的所有属性的列表 -
如果文件关闭则返回true ,否则返回false 。
|
返回打开文件的访问模式。 |
执行上面代码,这产生以下结果 -
文件对象的close()
方法刷新任何未写入的信息并关闭文件对象,之后不能再进行写入操作。
当文件的引用对象重新分配给另一个文件时,Python也会自动关闭一个文件。但使用close()
方法关闭文件是个好习惯。
执行上面代码,这产生以下结果 -
文件对象提供了一组访问方法,使代码编写更方便。下面将演示如何使用read()
和write()
方法来读取和写入文件。
write()
方法将任何字符串写入打开的文件。 重要的是要注意,Python字符串可以是二进制数据,而不仅仅是文本。
write()
方法不会在字符串的末尾添加换行符(‘\n
‘)
这里,传递参数 - string
是要写入打开文件的内容。
上述示例将创建一个foo.txt
文件,并将给定的内容写入到该文件中,最后将关闭文件。 在执行上面语句后,如果打开文件(foo.txt
),它将应该以下内容 -
read()
方法用于从打开的文件读取一个字符串。 重要的是要注意Python字符串除文本数据外可以是二进制数据。。
这里,传递参数 - count
是从打开的文件读取的字节数。 该方法从文件的开始位置开始读取,如果count
不指定值或丢失,则尽可能地尝试读取文件,直到文件结束。
下面来一个文件foo.txt
,这是上面示例中创建的。
执行上面代码,这产生以下结果 -
tell()
方法用于获取文件中的当前位置; 换句话说,下一次读取或写入将发生在从文件开始处之后的多个字节数的位置。
seek(offset [,from])
方法更改当前文件位置。 offset
参数表示要移动的字节数。 from
参数指定要移动字节的引用位置。
如果from
设置为0
,则将文件的开头作为参考位置。 如果设置为1
,则将当前位置用作参考位置。 如果设置为2
,则文件的末尾将被作为参考位置。
下面来一个文件foo.txt
,这是上面示例中创建的。
执行上面代码,这产生以下结果 -
Python os模块提供用于执行文件处理操作(如重命名和删除文件)的方法。要使用此模块,需要先将它导入,然后可以调用任何相关的函数。
rename()
方法有两个参数,即当前的文件名和新的文件名。
使用remove()
方法并通过提供要删除的文件的名称作为参数来删除文件。
以下是删除现有文件test2.txt
的示例 -
所有文件都包含在各种目录中,Python处理目录问题也很容易。 os
模块有几种方法可以用来创建,删除和更改目录。
使用os
模块的mkdir()
方法在当前目录中创建目录。需要为此方法提供一个参数,指定要创建的目录的名称。
以下是在当前目录中创建一个目录:test
的示例 -
使用chdir()
方法来更改当前目录。 chdir()
方法接受一个参数,它是要选择作为当前目录的目录的名称。
getcwd()
方法用于显示当前工作目录。
以下是给出当前目录的一个例子 -
rmdir()
方法删除该方法中作为参数传递的目录。删除目录之前,应删除其中的所有内容。
以下是删除“/tmp/test
”目录的示例。需要给出目录的完全限定名称,否则将在当前目录中搜索该目录。
有三个重要的来源,它们提供了广泛的实用方法来处理和操作Windows和Unix操作系统上的文件和目录。它们如下 -
这篇文章给大家分享的是关于Python浮点数运算有误差的相关内容,为何会出现这样的问题呢?我们又该如何避免和解决这个问题呢?接下来本文会给大家详细的介绍一下,感兴趣的朋友接下来一起跟随小编看看吧。
大家在写代码时都会遇到所谓的浮点误差,如果你还没踩过浮点误差的坑,只能说你太幸运了。
以下图的 Python 为例, 进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。