写在开头
通过与golang(>=2.0)对比学习,从而快速上手py(python>=3.9)
运行第一个py程序
vscode下创建a.py写入(与go定义包名和main函数不同)
print("a")
右键选择终端运行py代码即可
python3.12官方文档地址在这里
1.缩进
在GO语言的学习中,我们通常使用大括号"{}"来标识一个代码块,而python使用缩进层次来组织代码块,约定一个缩进用4个空格标识(必须严格执行)
if True:
print("neo")
else:
print("smile")
多行语句使用反斜杠\作为语句结束(包含括号就不需要反斜杠)
total = item_one + \
item_two + \
item_three
days = ['Monday', 'Tuesday', 'Wednesday',
'Thursday', 'Friday']
2.引号和注释
在go中,单引号通常表示rune或byte类型,反引号表示字面量输出,双引号表示字符串
py中,单引号、双引号、三引号都表示字符串,其中三引号和go的反引号相似,多行文本格式化输出
word = 'word'
sentence = "This is a sentence."
paragraph = """This is a paragraph. It is
made up of multiple lines and sentences."""
注释使用"#"开头
# This is a comment.
# This is a comment, too.
# This is a comment, too.
# I said that already.
3.换行输出print
函数print默认就是换行的,当被赋予变量时,表示从命令行模式中获取输入
var1 = print("1")
# 1 aaaa
# var1 = "aaa"
4.变量
4.1变量声明
go的变量声明与赋值方式有两种:var字面量和类型推断
var a int=1
b:=1
py与php类型,变量没有类型,直接声明
a=1
所以py是动态语言,在运行时才会被确认类型
4.2多变量赋值
除了和go一样的多变量外,还多出一个连等
a,b,c=1,2,"a"
a=b=1
4.3常量
在go中使用const,py则使用全部大写表示
BI=3.14
4.3.1内置常量
即None,go的nil是内置变量可被修改,这个是常量,表示为空
5.数据类型
Python3 中有六个标准的数据类型:Number(数字)、String(字符串)、List(列表)、Tuple(元组)、Sets(集合)、Dictionary(字典)。
Python3 的六个标准数据类型中:
- 不可变数据(3 个):Number(数字)、String(字符串)、Tuple(元组);
- 可变数据(3 个):List(列表)、Dictionary(字典)、Set(集合)。
这里的不可变指,数据对应变量的值发生变化,内存也会跟着变(指之前的内存地址保存的不可变);反之可变为内存不变
5.1数字number
py3支持整形int、浮点型float、布尔bool和复数complex(高等数学内容),类型转换和四则运算与go无差异
a=False
5.2不可变序列-字符串
和go一样都可以对字符串进行切片操作s[0]
a="aaa"
a[2]="b"
print(a)
当然上述代码和go一样是不通过的,因为内存内容不可变
这里谈一下格式化输出和连接字符串,py更推荐使用format格式化输出
a="aaa"
b="{},{}".format("hello","world")
print(b)
b="{0},{1},{0}".format("hello","world")
print(b)
连接字符串虽然使用加号也可以,但每次操作会重新计算开辟和释放内存,效率更低,因此推荐使用join
l = ['2017', '03', '29', '22:00']
s5 = '-'.join(l) # '2017-03-29-22:00'
s6 = s5.split('-') # ['2017', '03', '29', '22:00']
5.2.1字符串编码
和go一样都是unicode编码(好像大部分语言都是如php和js),下面是网络传输的网络字节序转换实例
str = '学习Python'
print (str.encode()) #默认utf-8编码
print (str.encode('gbk'))
print (str.encode().decode('utf8'))
5.2.2切片步长和负步长
py的切片可以给元素设置步长
a=[1,2,3,4,5,6,7]
b = a[0:6:2]
print(b) #1,3,5 end是不包括
负步长很好理解,从后往前遍历
5.3不可变序列-元组Tuple
和枚举类似,一旦声明,不能修改(包括成员和长度,这点和字符串一样属于不可变序列)
因为不能修改,因此元组主要用于处理一次性数据(这也是列表和元组区别)
我们使用圆括号()定义元组或者tuple函数创建元组
letters = ('a','b','c','d','e','f','g')
print(letters[0]) # 输出 'a'
print(letters[0:3]) # 输出一组 ('a', 'b', 'c')
del letters
5.4可变序列-List列表
处理同类可重复的数据使用列表,使用中括号[]声明或者list()隐式转换,使用del删除列表或成员
列表有序可重复,类似go切片,长度和成员都可变
a=list("red")
del a[1]
print(a) #['r', 'd']
print(type(a))#<class 'list'>
Weekday = ['Monday','Tuesday','Wednesday','Thursday','Friday']
#搜索
print(Weekday.index("Wednesday"))
增加
Weekday.append("new")
删除
Weekday.remove("Thursday")
5.4.1列表常见操作
添加元素分别为分别为insert,append,extend image.png这里注意extend参数是可迭代对象,可迭代对象通俗点说法就是可以被for ... in ...执行的对象,本质是实现了 iter() 方法或者 getitem() 方法的类,用go语言描述就是下面两接口的实现之一
type iteral interface {
iter()
}
type iteral2 interface {
getitem()
}
下面是py3自定义可迭代对象demo,使用isinstance判断
from collections.abc import Iterable
class A :
pass
class B:
def __iter__(self):
return self
a = A()
b = B()
print(isinstance(a,Iterable) )#False
print(isinstance(b,Iterable) )#True
那么py内置的可迭代对象有哪些?
The collections.abc.Sequence abstract base class defines a much richer interface that goes beyond just getitem() and len(), adding count(), index(), contains(), and reversed(). Types that implement this expanded interface can be registered explicitly using register().
支持下标访问,即实现了getitem方法;可通过len方法获取长度,即定义了len方法,那不就是list列表,str字符串,元组tuple和bytes吗,其实还可以使用range函数返回一个可迭代对象,之后会提及
综上我们也就知道了下面这行代码错误的原因
a=[1,2]
a.extend(1)
#TypeError: 'int' object is not iterable
修改元素
image.png
计算长度使用len和count
image.png
排序使用sort
image.png
5.5集合Sets
无序不重复,不能被索引
使用大括号{}定义或者set()创建
a_set = {1,2,3,4}
# 添加
a_set.add(5)
print(a_set) # 输出{1, 2, 3, 4, 5}
# 删除
a_set.discard(5)
print(a_set) # 输出{1, 2, 3, 4}
5.5.1set常见操作
image.png5.6字典map
没啥好说的,go的map
键不能重复,并且整形1和浮点型1.0会被当成相同的键这点需要注意
使用大括号定义或dict()函数创建
Logo_code = {
'BIDU':'Baidu',
'SINA':'Sina',
'YOKU':'Youku'
}
print(Logo_code)
# 输出{'BIDU': 'Baidu', 'YOKU': 'Youku', 'SINA': 'Sina'}
print (Logo_code['SINA']) # 输出键为 'one' 的值
print (Logo_code.keys()) # 输出所有键
print (Logo_code.values()) # 输出所有值
print (len(Logo_code)) # 输出字段长度
5.6.1字典操作
字典内置函数:
- map.items() 访问字典的键值对
- map.keys() 访问字典键
- map.values()访问值
- map.get(xxx) 访问指定键,不存在返回None
- map.setdefault(a[,b])顾名思义,存在key返回值,不存在则插入键值对
判断字典是否存在某个键
has_key在py3中被移除,推荐使用关键词in
m = {1:"a"}
print(1 in m)
print(2 in m.keys())
移除键使用pop()或popitem(),区别是后者会返回值
除此以外py3.9字典还支持 |=运算符,即新旧字典键相同时,用新的值去替换
使用zip函数合并两个列表为字典 image.png
6.流程控制
主要还是讲讲go没有的吧(if else谁都有)
还需要注意的是match/cass 是3.10的语法,用法和switch一样
6.1 for
官方文档的定义是将for和in绑定使用的 image.png也就是是for 变量名 in 可迭代对象 ,且根据定义描述后面是可以跟else语句的,当迭代器迭消耗完时执行else语句(即break不执行else语句)
m=list("red")
for str in m:
if str=="e":
break
else :
print(str)
else :
print("bye")
6.2 while
和go的for类型,不同的是可以添加逻辑判断
count = 0
while count < 5:
print(count, " is less than 6")
count = count + 1
else:
print(count, " is not less than 6")
6.3 序列-range对象
image.png如果你需要一个可迭代对象,内置函数 range() 会很方便,它生成一个等差级数链表:
range (start, end, scan):
- scan表示每次跳跃的距离,默认为1;
- start不写就是默认0
- end不包括
for i in range(6,12,2):
print(i)
#6,8,10
a = ['i', 'love', 'coding', 'and', 'free']
for i in range(len(a)):
print(i, a[i])
6.4pass空语句
Python pass 是空语句,是为了保持程序结构的完整性。它用于那些语法上必须要有什么语句,但程序什么也不做的场合(因为py不用大括号表示代码块)
class MyEmptyClass:
pass
7.函数
语法
def 函数名(参数列表):
函数体
函数体中不带表达式的return相当于返回None
同时py也支持返回多个值
8.模块
语法
import 模块名
模块名就是文件名,调用和go一样,如下
# hello.py
def sayhello(a):
print("hello",a)
#main.py
import hello
hello.sayhello("a")
8.1 from import
允许py从模块中导入指定的变量、函数或类等
from 模块名 import 符号
如下,调用时就不需要加上包名
from hello import sayhello
sayhello("a")
同时from ... import * 就表示全部
9.包
类似go的package以目录组织文件方式,py包结构如下
pakageName
-------__init__.py
-------moduleName1.py
-------moduleName2.py
------- ...
也就是说包路径下必须有init.py文件(里面不需要写内容),此时模块名就变成了目录名
10.协程
和js一样使用async def修饰函数,是py3.7功能
网友评论