本人从事软件开发有几年了,主要从事的是C++开发,基于WINDOWS下,MFC/C/C++/STL等等,还有大量的第三方库,也接触使用了C#语言和Java。现在人工智能很流行,想渐渐地涉猎这一部门,所有先学一下Python这个语言。
我们现在用到的编程语言基本上是C/C++,可能也会用到C#或者JAVA,这些都是基本语言。但随着软件的进一步提升,随着技术的革新,这些基本语言已经不能满足于未来的发展。比如现在的云计算、人工智能、物联网、区块链等等,所以必须要学习更多的高层次的语言。目前主流的就是Python语言,它是一个具有很强可读性的脚本语言。可以很容易的镶嵌到我们的软件中,比如调用图像库,执行智能算法,处理大数据,等等。软件中复杂的或者高技术的东西都可以用它帮助去处理。
它是一种解释型语言,类似于PHP和Perl语言,不同于C/C++需要编译。当然它也是面向对象的,符合基本语言的封装继承的编程风格。它对于会C++/C#/JAVA的人来说很容易理解,很容易学会。它自身的特点是易于学习、易于阅读、易于维护、可移植、可扩展、可嵌入、拥有数据库、GUI编程和丰富广泛的标准库。
Python是免费开源的,支持多平台,官网上下载一个64位的按说明书安装到WIN7系统,设置系统环境变量就可以了。当然同C++使用VS一样,我使用PyCharm工具来开发Python程序,所以要下载一个PyCharm工具来安装。
PyCharm工具是全英文的,同VS很类似,但有几点不同。不同于VS,Python文件的后缀是.py,没有编译只有运行,但有标签断点可以单步调试debug。关于代码编辑区域的设置基本和VS一致。
下面记录一下关于Python学习到的知识点,重点记录不同于C++的地方。
标识符由字母数字下划线组成,首字符必须为字母或下划线_,且大小写敏感,Python3后的版本支持非ASCII字符,即中文也可以但不推荐。
初步学习保留字即关键字。条件类['if', 'elif', 'else'],循环类['for', 'break', 'continue', 'in', 'while'],特殊字['False', 'None', 'True',],导入类['from', 'import'],类定义'class',函数定义'def',全局定义['global', 'nonlocal'],异常处理['try', finally', 'assert', 'except', 'raise'],赋值类['with', 'as'],删除变量'del',返回'return',空语句'pass',等于'is',逻辑运算符['and', 'not', 'or'],匿名函数'lambda',生成器函数['yield']。
Python的注释。单行以#开头,多行为’’’或”””。代码块不需要C++的{},通过行缩进实现。多行语句使用反斜杠\,而[]{}()中不需要使用。函数之间、类之间、类和函数入口都需要空行分割。同一行显示多条语句用;分开。代码块即代码组首句以关键字开始,以冒号:结束,内容缩进处理。解释器路径#!/usr/bin/env python3,WIN下可以不加。可以用help(函数名)来查看内置函数的参数列表和帮助文档。Python的编程模式有两种:交互式,脚本式。交互式下需要打开CMD命令提示符窗口并输入python回车进入Python功能里就可以编程。脚本式下需要先把python功能写好保存在后缀为.py的文件中,然后从外部调用这个文件,它可以使用cmd窗口调用,也可以从其它软件中调用。
Python的运算符和C++有几处不一样。逻辑运算符and or not输出的是值不是bool,海象运算符:=,成员运算符in\not in,身份运算符is\not is。没有C语言的自增自减运算。
基本数据类型不同于C++,Python的变量不需要声明,但在使用前必须赋值。变量没有类型,变量所指内存中的对象才有类型。允许同时为多个变量赋值。有六个标准的数据类型,Number数字、String字符串、Tuple元祖、List列表、Set集合、Dictionary字典。其中后3种数据内容可变。迭代器Iter()、next()和StopIteration。
数字支持int、float、bool、complex。5 / 2 除法得到浮点型2.5,5 // 2整除得到整形2,2 ** 5乘方得到32。混合运行按浮点型处理。支持科学计数法2.5e2。多了一种复数a+bj,complex(a,b)。二进制0b01001,八进制0o37,十六进制0xAF。
字符串用单引号 ' 或双引号 " 括起来,同时使用反斜杠 \ 转义特殊字符。+为连接两个字符串,*为重复几次前面的字符串。索引方式从左0开始,从右-1开始。与C++不同这里不能改变某一字符,也没有单独的字符类型。格式化字符串的格式为%[(name)][flags][width].[precision]typecode,(name)为命名,flags可以为+-‘’0填充,width宽度,precision精度。包含了左右对齐,填充字符等。 例:{:+.2f} {:0>5d} {:,} {:.2%} {:b}。python三引号允许一个字符串跨多行,字符串中可以包含换行符、制表符以及其他特殊字符。
列表中的类型可以不相同,允许嵌套,和C++不同,用[ ]括起来,用逗号隔开。可以索引或截取,支持+和*,规则同字符串。列表中的元素可以被改变。
元祖类型同列表,不同之处是元素不可修改,同( )括起来。于字符串不同的是元素类型可以不同。空元祖为(),1个元素的元素为(a,),支持+号规则。函数多个返回值时用元祖类型。
集合是一堆事物或对象组成的,功能是成员关系测试和删除重复元素。用{ }或者set()函数创建,空集合是set(),空字典是{ }。无序不支持索引。支持-差集,|并集,&交集,^异或集。
字典通过键来存储,是一种映射类型,用{ }标识无序的键(key):值(value)集合。键必须使用不可变类型,且唯一。推导式{key:value for variable in iterable [if expression]}。
Python中没有switch–case语句,没有do..while循环。While/Do循环可以使用else语句,在条件语句为false时执行else的语句块。生成器yeild是一个返回迭代器的函数,只能用于迭代操作。在调用生成器运行的过程中,每次遇到 yield 时函数会暂停并保存当前所有的运行信息,返回 yield 的值, 并在下一次执行 next() 方法时从当前位置继续运行,可以减少返回内存过大。函数以def开始,以:结束,不设返回值类型,首行是函数说明,需要返回的直接return。以*传入的参数按元祖处理,**传入的参数按字典处理,表示不定长参数。使用 lambda 来创建匿名函数。默认参数必须放在最后面。不同于C++,这里可以以元祖方式返回多个值。对于变量作用域,变量的访问以 L(Local) –> E(Enclosing) –> G(Global) –>B(Built-in) 的规则查找,即:在局部找不到,便会去局部外的局部找(例如闭包),再找不到就会去全局找,再者去内建中找。可以显式指定函数的参数类型及返回值类型。
模块是一个包含所有你定义的函数和变量的文件,其后缀名是.py。模块可以被别的程序引入,以使用该模块中的函数等功能。包是一种管理 Python 模块命名空间的形式,采用"点模块名称"。就好像C++的动态库差不错,每个包都必须还有一个 __init__.py 的文件,可以为空,可以放一些初始化的代码,可以为__all__变量赋上包内所有模块名的值。命名空间(Namespace)是从名称到对象的映射,大部分的命名空间都是通过 Python 字典来实现的。命名空间提供了在项目中避免名字冲突的一种方法。各个命名空间是独立的,没有任何关系的,所以一个命名空间中不能有重名,但不同的命名空间是可以重名而没有任何影响。
Python的面向对象和C++差不错,也有类,继承,对象、重载、覆盖等等。其中不含有public等关键字属性,使用__双下划线表示私有属性。所有方法中的第一个参数必须为self自身实例。构造函数固定为__init__,参数可以变更。析构函数为__del__。静态函数为@staticmethod 装饰的不带 self 参数。类方法为@classmethod 装饰的默认有个cls参数。
经过一天的学习,Python的基础教程基本学习完了,了解了基本语法和规则,更多的还是和C++做了一些比较,如果一样定义的话这里就匆匆掠过了,这里只需要了解它的不同之处。有了C的经验基础,学习起来也很容易懂,所有只用了很少的时间就起到一个入门级别了。当前,Python是高级语言,学习的东西还是很多,更高级的编程需要后面一点点积累,工作中用的多了就会越发熟悉。