程序设计语言篇—Python&几种语言区别的总结
文章目录
在线编辑器
在线编辑器
Python教程:Python教程
Python菜鸟教程
一、Python介绍&理解
1.1 Python基础
1、Python定义:面向对象的解释型语言,结合了跨平台性和互动性的高级通用脚本语言。保留了编译器的部分功能,随着程序的运行,解释器也会生成一个完整的目标代码。
2、Python的特点:
- 易于学习:关键字少,结构简单(没有分号、begin、end等标记→对缩进要求高),有一个明确定义的语法,仅有35个保留字,
- 易于阅读/维护:结构清晰、源代码易于维护
- 广泛的标准:有丰富的库,可以跨平台使用,在UNIX和Windows 兼容很好。
- 互动模式:可以从终端输入执行代码并获得结果的语言、互动的测试和调试代码片断。
- 可移植:开放源代码,因此Python已经被移植到许多平台。
- 可扩展:可以结合其他语言,比如使用C或C++完成一段运行很快的关键代码,然后从 Python 程序中调用。
- 可嵌入:可以将Python 嵌人到 CC++程序,让程序获得“脚本化”的能力。
- 数据库:Python 提供所有主要的数据库的接口。
- CUI编程:支持GUI可以创建和移植到许多系统调用。
3、Python的应用领域
- Web 和Internet 开发:Python 有大量成熟的 Web框架,如 Django、Flask、Bottle、Tornado 等。
- 科学计算和统计:Python 有像 NumPy、Pandas 这样的科学计算库,完全可以代替R语言和 MATLAB。
- 人工智能:通用机器学习可以使用sklearm,深度学习有谷歌的TensorFlow和脸书的PyTorch,这些都是业界最流行的 Python机器学习框架。就连著名的阿尔法围棋(AlphaGo)也是使用Python编写的。
- 桌面界面开发:GUI
- 软件开发:App
- 网络爬虫:Python+Matlab
1.2 Python规范
1、行与缩进:严格遵守缩进规则
- 缩进方式:①单个制表符;②两个空格;③四个空格,不能混用。
- 缩进定义:每行语句开始前的空白区域,用来表示Python程序间的包含和层次关系。
- Python中:顶行编写且不留空白,Python不使用{},采用缩进的方式来控制函数、逻辑判断、代码组,同一层次必须使用相同数目的缩进空格数,否则就会报错"unindent does not match any outer indentation level"表示"文本没有对齐"。
2、代码组
定义:对于像if、def、while、class这样的复合语句,第一行以关键字开始,行的末尾以":"结束,在这之后的一行或多行所构成的代码片段叫做代码组,也成为子句。
在代码组中的每一行代码都要遵循相同的缩进规则。
3、注释
定义:代码中辅助性文字,会被编译器或解释器忽略,不会被计算机执行,用于对代码的说明。
注意:注释不能嵌套使用
#单行注释
'''
多行注释
'''
"""
多行注释
"""
4、源代码文件类型
以下这些都可以直接运行,不需要编译或者连接
- 源代码文件:.py,由Python负责解释
- 字节代码文件:.pyc,源文件经过编译后生成的文件,不能直接用文本编译器修改,与平台无关,可以在大部分操作系统上运行。(跨平台性)
- 优化后的字节码文件:.pyo,更像编译型语言里的中间文件。
5、“”>>>":Python语言环境的提示符,表示此符号后可以输入Python语句,没有的是Python语句的执行结果。
二、标识符&变量&常量
标识符命名规则:变量、方法、类等要素命名时使用的字符序列。即凡是自己可以起名字的地方都叫标识符
- 大小写字母、数字、下划线、汉字,首字符不能是数字(不建议采用中文开头)
- 变量名之间不能出现空格
- 区分大小写字母
- 不能与保留字相同
1、变量:都不需要声明变量,直接使用。
(1)变量的分类:
- 全局变量:函数之外定义的变量,访问权限:被文件内部的任何函数和外部文件访问【没有Java中的封装性之说】
建议:全局变量定在文件的开头,或者放到一个专门的文件中,用import引用。 - 局部变量:在函数之内定义的变量
【与Java区别】java是面向对象的,因此Java中的变量分为成员变量(类的成员之一)、局部变量
(2)变量的赋值方式:赋值操作就是变量声明和定义的过程。一次新的赋值将创建一个新的变量,如果没有赋值,Python认为该变量不存在。
- Python可以同时为多个变量赋值,如:a,b=1,2
- 一个变量可以通过赋值指向不同类型的对象。【指向什么类型就是什么类型的变量】
- 同步赋值语句:a,b=1,2;应用:同时给多个变量赋值,简化互换变量的值
2、常量
Python中没有提供定义常量的保留字,可以自定义一个常量类来实现常量的功能
class_const:
class ConstError(TypeError): pass
def _setattr_(self,name,value):
if self._dict_.has_key(name):
raise self.ConstError, "Can't rebind const const(%s)"%name
self._dict_[name]=value
import sys
sys.modules[_name_]=_const()
三、数据类型&运算符和表达式
3.1 数据类型
Python中标准的六个数据类型:【不可变】Number(数字)、String(字符串型)、Tuple(元组)、【可变】List(列表)、Set(集合)、Dictionary(字典)
理解:str()、tuple()、list、set()、dict():可以理解为数据类型的转换
使用它们创建相关类型的数据时(只接受一个参数,或者0):需传入一个可迭代的对象作为参数(列表、元组、集合、字典的键、字符串、文件对象、生成器、迭代器),无论可不可变,可以理解为数据类型的转换!
1、number(数字):可以进行数值运算
- Python中支持:int、float、bool、complex(复数),强类型语言【如Java】的每种一个代表
- 整数数值可以表示为十进制(默认)、二进制(0b)、八进制(0o)、十六进制(0x)
- 在混合计算的时候会自动将整形转换为浮点数【自动转换】
- /结果是多少就是多少,提供了int()来向0取整,//表示向下取整
2、String(字符串)
形式:‘’、“”,两种效果一样,注意Python中没有单独的字符类型,一个字符就是长度为1的字符串,字符串不能被改变【如果str[0]=‘a’会报错!】
定义空字符串:“”、’‘、str()
转义字符:\表示:换行\n、反斜杠\、单引号’、双引号"、制表符\t,当路径中有\,可以用\表示\,或者r"路径"
常用的操作:
- 截取/切片、索引,返回一个新的字符串。从0开始,-1表示末尾,尾下标取不到,如果是[0,-1],只能取到倒数第二个,[0:]取到尾。单双引号是不会输出的
- 变量[索引/下表]:从前往后从0开始越来越大,从后往前从负数-1开始越来越小
- 变量[头下标 : 尾下标]:同样尾下标取不到。
- 变量[头下标 : 尾下标]:步长正数:从前往后;步长负数:从后往前
- 连接操作+:表示连接字符串
- 复制操作*n:表示复制当前字符串n次,前后都行(注意复制后的字符串没有空格)
str = 'jiaoyu'
print(str)#字符串输出是没有引号的
print(str[0:-1])#jiaoy,不包含尾下标
print(str[0])#第一个字符:j
print(str[-3])#从后往前,从-1开始,即倒数第三个:o
print(str[str*2])#复制:jiaoyujiaoyu,注意中间是没有空格的
print(str+"TEST")#jiaoyuTEST
print(str[0:])
print(str[0:6])#这两个都能截取到全部字符串,超出索引也没事
3、tuple(元组)
定义:()之间元素之间用逗号分隔,元素类型任意,不变性,有序性,可重复性。字符串可以看成是一种特殊的元组。
定义空元组:()、tuple();1个元素的元组:[1,],注意要有逗号!
元组的不可变性性质:安全性(不希望被修改的数据)、性能(无需额外的内存来处理可能的修改)、哈希(可以作为字典的键/集合的成员)
常用的操作:索引、切片/截取、+连接操作,注意不能复制*n,否则元组的元素就重复了。操作和字符串一样
- 截取/切片、索引,返回一个新的元组/元组元素
- 变量[索引/下表]:得到是某个元组元素。从前往后从0开始越来越大,从后往前从负数-1开始越来越小
- 变量[头下标 : 尾下标]:得到的是某个子元组。同样尾下标取不到。list1[2:2]得到的是空列表
- 变量[头下标 : 尾下标 : 步长]:得到的是某个子元组。步长正数:从前往后;步长负数:从后往前
- 连接操作+:表示连接列表得到一个新的元组
4、list(列表)
定义:[]之间以逗号分隔开的元素列表,元素类型任意,可重复性,有序性,不变性
定义空列表:[]、list()
常用的操作:
- 截取/切片、索引,返回一个新的列表
- 变量[索引/下表]:得到是某个列表元素。从前往后从0开始越来越大,从后往前从负数-1开始越来越小
- 变量[头下标 : 尾下标]:得到的是某个子列表。同样尾下标取不到。list1[2:2]得到的是空列表
- 变量[头下标 : 尾下标 : 步长]:得到的是某个子列表。步长正数:从前往后;步长负数:从后往前
- 连接操作+:表示连接列表得到一个新的列表
- 复制操作*n: 表示复制列表得到一个新的列表
- 改变List元素:通过切片和索引得到列表的一个/多个元素,通过列表赋值来改变
- 改变某个元素值:得到某个索引位置的元素str[0],可以为其赋值各种类型的变量改变该位置的元素值
- 改变子列表(可以起插入作用或者替换1/多个元素):使用新的列表替换得到的子列表,特殊情况:list1[2:2]得到的是空列表,那么将新的列表放在索引为2这个列表元素的前面。
原则:列表元素可以是列表类型,列表不能不能替换列表某个元素(特殊情况该元素是列表类型)
#所有的操作都是基于原列表list1进行的
list1=['abcd',786,2.23,'Jiaoyu',70.2]
list1[2:2]#得到的是空列表
list1[0]=3#索引为0的元素值改变了[3,786,2.23,'Jiaoyu',70.2]
list1[1]=[3]#索引为1的元素值改变了['abcd',[3],2.23,'Jiaoyu',70.2],即用列表替换元素,本质还是一样的
#改变子列表
#list[0:1]=0#这种写法是错误的,因为0属于数值型,list[0:1]是子列表,不能赋值。特殊情况:该索引位置的元素是列表类型可以
list1[2:2]=[9,10]#得到的是空列表,将新列表[9,10]放在索引为2这个元素的前面,结果['abcd',786,9,10,2.23,'Jiaoyu',70.2]
列表提供的一些操作方法:
以ls=[1,2,3,4,5,6]为例,所有的都是基于原列表操作得到的结果
方法 | 描述 | 举例 |
---|---|---|
ls.append(x) | 在列表ls最后增加一个元素x | [1,2,3,4,5,6,x] |
ls.insert(i,x) | 在列表第i位置增加元素x,理解在索引位置元素的前面插入 | i等于2时[1,2,x,3,4,5,6];i等于-2时[1,2,3,4,x,5,6] |
ls.clear() | 删除列表中所有元素 | []空列表 |
ls.pop(i) | 将列表ls中第i项取出,并从ls中删除该元素 | i=2时[1,2,4,5,6];i=-2时[1,2,3,4,6] |
ls.remove(x) | 将列表中出现的第一个元素x删除 | 如果不存在的话会报错 |
ls.reverse() | 将列表ls中的元素反转 | [6,5,4,3,2,1] |
ls.copy() | 生成一个新列表,复制ls列表所有元素 | 注意原列表是不变的 |
总结:字符串、列表、元组
- 截取如果超出索引也没事,会完整的输出全部。因为如果str=“123”,那么截取全部可以str[0:]或者str[0:3]或者大于3都行。
- 步长为负数还有点疑问
- 因为尾下标取不到,如果头下标和尾下标一样,那么得到的是空字符串/列表/元组
- -1表示倒数第一个,-2倒数第二个,以此类推;0第一个,1第二个,以此类推。
5、集合set
定义:由一个或多个形态各异的大小整体组成,构成集合的事务/对象称作元素/成员。
形式:{}的元素以逗号隔开。可变性,唯一性(不可重复,如果定义了重复的那么会自动检测并删除),无序性,因此没有索引和位置的概念,可以动态地增加/删除,元素类型只能是不可变的数据类型(数值、字符串、元组)
定义空集合:set(),只能用这个,并且输出空集合的表示也是set()。而{}表示空字典。
基本功能:测试成员关系、删除重复元素
6、dictionary(字典)
定义:一种映射类型,{}标识,无序性,元素是键(key) : 值(value)对的集合。通过键取值,与列表通过偏移取值不一样!
键的特点:唯一性,元素类型时不可变类型(数值、字符串、元组)
定义空字典:{}、map()。注意创建字典的方式map1=map()
常用的操作方法:
- 取键、取值:字典.keys()、字典.values(),得到的类型分别是dict_keys、dict_values类型
- 以键取值:字典[键名]
- 连接+操作
dict={}
dict=dict()
tinydict={'name':'Jiaoyu','code':1,'site':'www.Jiaoyu.com'}
print(tinydict['one'])
print(tinydict[2])#得到键为2的值
print(tinydict)#得到完整的字典
print(tinydict.keys())
print(tinydict.values())
字典提供的一些操作方法:<字典变量>.<方法名称>(<方法参数>)
一般键值对都是以元组的形式(键,值),多个键值对组成列表,该列表又放在元组中。多个单独的键/值,组成列表,放在元组中
以d={‘张三’:100,‘李四’:99,‘王二’:66}为例,所有的都是基于原字典操作得到的结果
方法 | 描述 | 举例 |
---|---|---|
d.keys() | 返回所有键的信息 | ([‘张三’,‘李四’,‘王二’])类型时dict_keys |
d.values() | 返回所有值的信息 | ([100,99,66])类型时dict_values |
d.items() | 返回所有的键值对 | ([(‘张三’,100),(‘李四’,99),(‘王二’,66)]) |
d.get(key,default) | 键存在返回相应值,否则返回默认值default | 由键取值 |
d.clear() | 删除所有的键值对 | {}空字典 |
d.pop(key,default) | 键存在就返回相应的值,否则返回默认值default | 以键删值 |
d.popitem() | 随机从字典中取出一个键值对,以元组(key,value)形式返回,同时将该键值对从字典中删除 | (键,值)类型元组tuple |
3.2 运算符&表达式
1、算术运算符
加减乘除取余:+、-、* 、/、%,除是向0取整,使用int也是向0取整
向下取整://,而在VB中则表示向0取整,这点要注意,java/c中都没有这个运算符
幂: * *,表示x的y次方
2、比较(关系)运算符:运算结果是true、false,编译运行存储在计算机中是1,0。这一点与二进制符号位0正1负做一个区分
等于、不等于:==、!=(<>也可以,VB中就是这个)
大于、小于、大于等于、小于等于:>、<、>=、<=
3、赋值运算符
简单的赋值:=
与算术运算符结合=,举例:a += b表示a=a+b
4、逻辑运算符
逻辑运算符 | 逻辑表达式 | 描述 | boolean false、true | 变量 |
---|---|---|---|---|
and | x and y | 布尔"与",同真为真,短路性质 | 同true为true,但是如果第一个是false,第二个就不会再去判断了 | 同非0为非0,但是如果第一个是0,第二个就不会执行 |
or | x or y | 布尔"或",同假为假,短路性质 | 同false为false,但是如果第一个是true,第二个就不会执行 | 同0为0,但是如果第一个是非0,那么第二个就不会去执行 |
not | x not y | 布尔"非",取反 | true取反为false,false取反为true | 0取反为true,非0取反为false |
i=2
print(0 and i+1)#因为短路性质,i+1不会执行
print(i)#i还是2
5、运算符的优先级
运算符 | 描述 |
---|---|
** | 指数 |
* / % // | 乘除取余和取整数(向下) |
+ - | 加法、减法 |
<= < > >= | 比较运算符 |
<> == != | 等于(比较)运算符 |
= %= /= //= -= += *= **= | 赋值运算符 |
not and or | 逻辑运算符 |
四、常用的函数&内部函数
4.1 输入输出函数
1、input()函数:无论用户输入的是数字还是字符,统一以字符串类型返回结果
语法:<变量>= input(<提示性文字>)
2、eval(s):去掉字符串s最外侧的符号,并按照python语句方式\去掉引号后的字符内容
语法:<变量>=eval(<字符串>)
两者搭配使用:获取用户输入的数字
语法:<变量>=eval(input(<提示性文字>))
3、print()函数:对于字符串,去掉两侧的引号,输出结果是可打印字符。对于其他类型,直接输出表示,作为打印字符。
特点:可以接收多个参数,默认换行
不换行:print(<待输出内容>,end=“<增加至输出结尾>”)
a=eval(input("请输入整数:"))
print("输出的整数是:",a,end="\t")
print("!")
4.2 常用的内部函数
1、数值运算函数
绝对值:abs(x):求x得绝对值
除余:divmod(x,y):计算除//余%,输出为元组类型(x//y,x%y),其中//向下取整
幂运算:pow(x,y):幂运算,等价于x**y
幂运算:pow(x,y,z):幂运算,等价于x ** y%z
四舍五入:round(x)或round(x,d):对x四舍五入,保留d位小数,如果没有d则返回四舍五入得整数值
最大值:max(x,y,…)
最小值:min(x,y,…)
2、字符串处理函数
长度/个数:len(x),也可以返回其他组和类型得元素个数
转为字符串型:str(x),x可以是任意类型,相当于数据类型转换
ASCII码与字符:chr(x)、ord(x)。如chr(65)表示’A’,ord(‘a’)表示97
十六进制的小写字符串形式:hex(x)。比如hex(45)表示0x2d
八进制的小写字符串形式:oct(x)。比如oct(45)表示0x55
3、类型判断和类型间转换函数
查看类型:type(x)
int()、float()、str()、list()、dict()、tuple()
eval()是针对去除外面两侧的引号的。
int(-1.2)#向0取整
print(-3/2)#结果为-1,向0取整
print(-3//2)结果为-2,向下取整
int('1.2')#1.2
int('-1.2')#报错
int('-2')#-2
float('-1.2')#1.2
4.3 自定义函数&调用
1、定义函数规则:
- def 函数名()
- 传入的参数/自变量必须在()中,即形参
- 函数第一行,可以选择性的使用文档字符串——用于存放函数说明
- 缩进和 : 配合是方法体
- return [表达式]结束函数,选择性地返回一个值给调用方,省略return,相当于返回None
def functionName(parameters):
"函数_文档字符串"
方法体
return [repression]#return可以省略,就是返回None
2、调用函数
函数名(参数),即可调用
#定义函数
#!/usr/bin/python3
def max(a,b):ifa>b:
return a
else:
return b
8=4
b-5
#调用函数
print(max(a,b))
五、选择与循环结构
Python中没有switch…case语句
5.1 条件语句
if…else条件语句
if(表达式):
语句1
else:
语句2
if…elif条件语句
if (表达式1):
语句组1
elif(表达式2):
语句组2
......
elif(表达式n):
语句组n
else:
语句组m
5.2 循环语句
结束循环方式:break、满足条件,continue表示结束本次循环。
while循环
一般初始值在while前面的语句中赋值
while(表达式):
循环体
#while循环举例
counter=1
while(counter<4):
#逻辑语句
counter++
for循环语句
起始值、步长可以省略。终止值和逗号不能省【java中是分号不能省】
变量范围[起始值,终止值),终止值取不到,VB中是可以的,这是由循环顺序决定的
for 循环变量 in (<起始值0>,终止值,<步长1>):
循环体
六、最后总结区别&注意点(Java/Python/C/VB)
1、关于0、1表示正负数,true、false
在计算机存储的二进制中,符号位:0表示正数、1表示负数
布尔类型:0表示False,1表示True,只有VB中的-1表示True
VB语言字符串索引从1开始,其他类型如数组是从0开始,其它语言都是从0开始。
VB数组:Dim a (15) As Integer 没写从几开始表示默认从0开始,即该数组有0~15即16个元素,这一点与其他语言也不太一样
Dim a (0 to 5, 1 to 5)表示有6×5个元素
2、关于向下、向0(也叫只保留整数)取整:
- 在位运算符中a右移>>4可以理解为a除以2的4次方,结果是向下取整
- 在java/c/c++中:
- int a = -16/3,结果是-5,向0取整。功能和int()强转是一样的功能。
- float/double b = -16/3,在精度范围内就是小数,超出的小数位四舍五入
- 在python中,/表示除,int(x)向0取整,//表示向下整除
- 在VB中,
- Dim a As Integer; a = -16/3,向下取整;Int(-1.2)向下取整
- Dim a As Single/Double; a= -16/3,小数位可以四舍五入
- Dim a As Integer; a = -16\3,表示向0取整,Fix(-1.2),向0取整。
理解:VB对于int()的底层实现与其他语言是不一样的,其他语言相当于强转
3、运算符的一些区别
- 只有VB是"=“即表示逻辑运算符又表示赋值,其他的都用”=="做一个区分
- 取余/模:VB中Mod,其他%
- 字符运算:VB中+、&(+有数值/数值型字符串/字符型表示数值运算,但是如果一边数值一边字符串就会报错,要么就全是字 符串型就表示连接;&不管是什么都表示连接)
- 逻辑运算符:VB/python中not、and、or;C中&&、||、!,java中&、&&、|、||、!、~(异或)
- 不等于:VB中<>,C/java中!=,python中两种都行
- 幂值:VB中Exp(x),表示e的x次方,C中pow(a,b),python中pow(a,b),或者a**b
- 自然对数值:VB中Log(x)表示lnx,C中log(x)
- python里面没有++、–运算符、switch…case结构,其他的语言都有
4、关于标识符的命名规则:变量、方法、类等要素命名时使用的字符序列。即凡是自己可以起名字的地方都叫标识符
- C中:大小写字母、数字、下划线,第一个字符不能是数字,区分大小写
- Python:大小写字母、数字、下划线、汉字,第一个字符不能是数字,区分大小写
- Java:大小写字母、数字、下划线、$,第一个字符不能是数字,区分大小写
- VB:字母、数字、下划线、汉字,第一个字符不能是数字、汉字,必须以字符、下划线开头
总结:除了VB不能是数字、汉字,其他的是不能是数字,python、VB可以包含汉字,其他都没有
5、容易搞错的写法:Java:true、false、String
6、为多个变量同时赋值
- Java/C/C++中:①int a = 10, b = 10, c = 10;②int a, b, c; a = b = c = 10;
- Python中:同步赋值语句的特点(作用:同时给多个变量赋值,简化互换变量的值)
- a,b=1,2
- VB中:Dim a, b as Long;表示a为变体型,b为Long。
7、Java中print、println()只接受一个参数/0
Python中可以接受多少个
8、关于语句块
python提供 缩进与 : 配合
c/java中提供()与{}配合
VB中提供Then、End配合
9、关于if、else
python中if…elif
c/java中else if,是带空格的
VB中ElseIf() Then
10、switch…case
VB中Select Case 测试表达式
Case 表达式1
语句组1
…
End Case
C/Java中:
switch(){
case 常量表达式1:
语句组1
default:
语句组n
}
Python中没有
11、循环
python中
for 变量 in 集合(<起始值0>,终止值,<间隔数1>)
C/Java中
for(;😉{
}
12、几种语言的运算符汇总
注意:VB中优先级:幂^→乘除* /→整除\(截取) →Mod→加减+ -
sqr表示开根号,C中sqrt表示开根号