编译器和解释器简单来说都是翻译工具。
编译型语言特点:
拥有可执行程序后可以随时运行,不需要重新编译,即“一次编译,无限次运行”,因此编译型语言可以脱离开发环境运行(什么是开发环境?);
编译型语言通常是不能跨平台的,也就是不能再不同的操作系统之间随意切换。不能跨平台表现在两方面:
1:可执行程序不能跨平台。不同的操作系统对可执行程序的内部结构有着截然不同的要求,彼此之间不能兼容;
相同的也可能不行,比如x64程序不能在x86平台上运行。
2:源代码不能跨平台。不同平台支持的函数、类型、变量等可能都不同,基于某个平台编写的源代码一般不能拿到另一平台上直接运行。比如在C中,Windows中的
Sleep()
函数在 Linux下是 sleep()
,且前者单位为毫秒,后者单位为秒。Windows 64位和Linux中C的
long
类型占用的字节分别为 4 和 8 。
所以编译型语言的主要缺点就是可移植性差。
解释型语言特点:
可以类比为C/C++中的头文件,但与头文件不同的是,任何python程序都可以作为其他python程序的模块。用
import
关键字可以引入一个模块。比如:
1 | def say() |
这里面 hello.py
实际上就是一个自定义的模块,调用模块中的函数时,语法为
模块名.函数名
。
1:无需加分号。
2:注意缩进:
1 | if 5>2 |
3:没有声明变量的命令。
4:字符串用 ''
和 ""
都可以。
5:变量命名规则同 MATLAB。
6:一行中多个变量赋值:
1 | a,b,c="x","y","z" |
7:两个字符串拼接用
+
(文本与变量、变量与变量之间都可),数字之间用
+
是正常运算:
1 | a=world |
8:函数,用关键字 def
即可,注意缩进:
1 | def myfunc() |
9:全局变量与局部变量同C/C++。在函数内部创建全局变量用
global
关键字,在函数内部修改全局变量需要加上
global
关键字:
1 | x='a' |
10: 输入:
1 | x=input("一些描述") |
input()
函数默认返回字符串,如果使用输入的数字,需要用对应的类型进行转换:
1 | x=int(input()) |
类型 | 类型 |
---|---|
文本类型 | str |
数值类型 | int , float ,
complex |
序列类型 | list , tuple ,
range |
映射类型 | dict |
集合类型 | set ,
frozenset |
布尔类型 | bool |
二进制类型 | bytes ,
bytearray , memoryview |
1:用 type()
获得数据类型。
2:指定数据类型时可以用 x=name(content)
,如
1 | x=str(”hello world“) |
3:复数 complex
用 j
作为虚部。
4:用 int(data)
, flaot(data)
,
complex(data)
进行数据类型转换,注意无法将复数转化为其他类型的数据。
5:bool()
也可以用来评判数据为 True
还是
False
,除空字符 "" ''
、0
和空列表 (),[],{}
外,bool()
总是返回
True
.
1:用三个引号可以将多行字符串赋值给变量,单引号与双引号均可:
1 | a="""aa |
2:Python中的字符串是表示unicode字符的字节数组,但是python不像 C/C++ 那样有字符类型,单个字符就是长度为1的字符串。
1 | a="abcdefg" |
3:字符串的内置方法
1 | a=" abcdefg " |
不能直接用 +
组合字符串和数字,但是可以用
format()
方法。format()
方法接受传递的参数,格式化它们并且将它们放在占位符 {}
所在的字符串中:
1 | str="I am {} years old" |
4:一些关键词
可以用 in
或者是 not in
来判断字符串种是否存在特定短语或字符。
1 | str="China is a great country" |
5:一些函数
1 | len(str)#获得str的长度 |
很多运算符与C/C++几乎都一样,下面是一些特别的例子:
运算符 | 名称 |
---|---|
** |
幂 |
// |
整除 |
is, is not |
身份运算符,判断两个变量是否为同一个对象 |
and, or, not |
逻辑运算符 |
in, not in |
成员运算符,用于测试序列是否在对象中出现 |
列表很像STL中的
vector
,是有序且可以更改的集合。可以代替C/C++中的数组。
1:创建列表:
1 | list1=[1,2,3] |
输出 list1
和 list2
会将元素连同方括号与引号都输出,同时只会输出单引号。
2:索引与字符串(数组)的索引规则相同。利用索引可以更改特定项目的值。
3:可以用 in
关键字。包括后面的元组、集合和字典都可以使用该关键字用来判断某个元素是否在其中。
4:可以用 len()
函数。包括后面的元组、集合和字典都可以用该函数求出它的长度/元素个数。
5:增:
insert(loc, element)
将 element
插入作为第 loc+1
个位置;append(element)
方法在列表的末尾增添元素
element
;同样也能添加另一个列表6:删:
remove(element)
方法删除指定的项目
element
;pop(num)
方法删除指定的索引,若未指定索引,则删除最后一项;del list1[num]
删除指定的索引;del list1
删除整个列表(删除后使用该变量会报错:NameError: name 'list1' is not defined.
);clear()
方法清空列表得到空列表。7:复制列表
list2=list1
copy()
方法: list2=list1.copy()
list()
构造函数:
list2=list(list1)
8:合并列表
+
extend()
方法:
list2.extend(list1)
元组是有序且不可更改的集合,因此也就不能增删补以及拷贝赋值。
1:创建
1 | tuple1=("apple",)#必须要加逗号,否则不能被识别为元组,而会被识别为字符串 |
若
1 | tuple0=("1") |
2:索引与字符串(数组)的索引规则相同。只能利用索引访问元的值。如果想要更改元组中的值,可以把元组转化成列表(用
list()
),再用 tuple()
转化为元组。
3:不能删除元组中的项目,但是可以用 del
关键字删除元组。效果同列表。
4:常用方法:
方法 | 描述 |
---|---|
count() |
返回元组中指定值出现的次数 |
index() |
在元组中搜索指定的值并返回它的下标 |
5:合并只能用 +
。
6:和列表一样可以用 tuple()
构建元组。
1:集合是无序的,不能像前面三种结构那样用下标进行索引,只能遍历或用关键字
in
。
2:集合中的元素无法更改,但是可以增加新元素。
1 | set1={"1","2","3"}#也可以用set()构造集合,类似于前面的数据类型 |
3:也可以删除元素。用 remove()
方法或者
discard()
方法来删除指定元素,括号内填写要删除的元素;用
pop()
方法来删除随机元素并返回删除的元素;
clear()
方法删除集合中的所有元素得到空集合;del
关键字删除集合。
如果要删除的项目不存在, 用 remove()
会报错,而
discard()
不会(不会输出任何信息)。
4: union()
方法返回两个集合的并集,update()
方法可以将一个集合中的元素插入到另一个集合中(得到的也是并集,会直接赋值给使用该方法的集合)。
1:创建。
1 | dict1={ |
2:访问。
1 | x=dict1[key1] |
3:循环遍历字典返回key,用 values()
方法返回value,用
items()
方法遍历 key 和 value(需要两个循环变量)。
1 | for x,y in dict1.items() |
4:删。
1 | dict1.pop(key1)#pop()方法删除指定key的item |
5:复制字典。
dict2=dict1
表示 dict2
是
dict1
的引用,更改 dict1
也会造成
dict2
的更改 ,复制的正确方法:
1 | dict2=dict1.copy() |
1 | if b>a: print("b>a") |
1 | #while循环 |
C/C++中的 break
和 continue
在Python中依然可以用。
1:默认参数。
1 | def myfunc(country="China"):#默认参数用= |
2:参数传入函数后数据类型不变。
3:关键字参数
1 | def myfunc3(child3,child1,child2): |
在调用时指定参数的值,无需考虑顺序。
4:任意参数。
1 | def myfunc(*kids)#加上*表明参数数目未知 |
函数将接受一个类型为tuple的参数,并可以用它的索引方式访问元素。
1 | 函数名=lambda 参数:表达式 |
比如:
1 | f=lambda x,y:x+y#多个参数时加逗号 |
或者用在 return
语句中:
1 | def myfun4(n): |
但是如果:
1 | def myfun4(n): |
参数数量不够,会输出
1 | <function myfun4.<locals>.<lambda> at 0x000001E7B43AEEF0> |