简介
Python是强类型(不允许隐式转换)、动态类型语言(在执行时才检查变量类型,允许变量重新赋值为其他类型、为对象自定义添加属性)。
基础语法
-
#
或字符串表达单行注释,'''
或"""
字符串表达多行注释,采用缩进(约定为四个空格)表达代码块,而非大括号{}
# print absolute value of an integer:
a = 100
if a >= 0:
print(a)
else:
print(-a)
- 单行语句
Python 通常是一行写完一条语句 , 或通过;
分隔在一行内显示多条语句 - 多行语句
使用\
可实现多行语句
total = item_one + \
item_two + \
item_three
在 [], {}, 或 () 中的多行语句,不需要使用\
,例如:
total = ['item_one', 'item_two', 'item_three',
'item_four', 'item_five']
- 赋值
a=10
a,b,c=20,a+5,100
print(a,b,c)#20 15 100
d,e,f=(1,2,3)
print(d,e,f)#1 2 3
- 通过
id(<变量名>)
可以获取目标对象的内存地址
数据类型
- 数字 : 整数
int
(0x前缀表示十六进制)、浮点数float
- 字符串
str
: 转义字符\n
表示换行,r'...'
表示自然字符串(无视转义字符),'''...'''
和"""..."""
表示多行内容(或注释),可以与r
配合使用
>>> print('''Line1
Line2
Line3''')
等价于
'Line 1\nLine 2\nLine 3'
-
布尔值 bool
True、False- 布尔运算
and、or、not
- 布尔运算
-
空值 None
-
bytes
用带b前缀的单引号或双引号表示
判别数据类型
- isinstance()
子类属于祖先类为真
如判断100是否为数字
isinstance(100, (int, float))#true
- type()
type(10)#<class 'int'>
输出 print
每次 print
输出默认是换行的,如果要实现不换行需要在变量末尾加上 end="":
print( 'a', end=" " )
print( 'b', end=" " )
输入 input
print ("请输入你的名字")
name=input()
print (name)
四种数据结构(容器)
1. 列表list
- 类似js的Array
- 使用负数当索引可以获取倒数的元素
插入元素
- .append(newItem)
- .insert(index,newItem)
删除元素
- .pop(index)
不传入index则默认删除末尾元素
2. 元组 tuple
- 元组比列表更省内存
- 其中每个元素的指向不能改变,也不能新增/删除元素
- 当只有一个元素时需加
,
,否则()
会被解析为数学公式的小括号
t = (1,)
3. dict 字典
类似js中直接创建的对象,但各种类型都可以作为key,例如
myDict = {threading.current_thread(): 100}
print(myDict[threading.current_thread()])#100
和list相比,dict查找/插入速度快,不会随着key的增加而变慢;但需要占用大量内存。
myDict = {'Michael': 95, 'Bob': 75, 'Tracy': 85}
myDict1 = dict('Michael'=95, 'Bob'=75, 'Tracy'=85)
print(myDict == myDict1 )#True
无法获取key不存在的字典值,可通过in
或.get()
方法进行判断
'tk' in myDict
myDict['Thomas']
myDict.get('Thomas')
myDict.get('Thomas', -1)#设置默认值
4. set 集合
无序且不会有重复元素,只能以int
、str
等不可变对象作为键
s = set([1, 2, 3])
s = {1,2,3}
- 可通过
.add()
新增元素,.remove()
删除元素 - 两个
set
可通过&
取交集,|
取并集 - 无法被切片或索引
比较
==
类似js的==
is
类似js的===
条件判断
if <条件判断1>:
<执行1>
elif <条件判断2>:
<执行2>
else:
<执行3>
- 条件判断语句如为非布尔值,非零数值、非空字符串、非空list等视为True,否则为False
其他情况下的语句不能支持隐式转换,如"5"+10
- not 同js中的
!
if not 50>100:
pass
循环
for循环
for item in list:
pass
for index,item in enumerate(list):
pass
- enumerate
把传入的list以(index,item)
的形式打包成一个个元组,然后返回由这些元组组成的对象。可以使用 list() 转换enumerate对象以输出列表。
>>>list(enumerate(['a','b']))
[(0,'a'),(1,'b')]
推导式(列表解析式、字典解析式、集合解析式)
书写方便,且执行效率远远高于通过循环生成列表/字典/集合
注意元组没有解析式,当使用()
时会生成generator
l = [i+1 for i in range(1,11) if i<5]
#[2, 3, 4, 5]
d = {i: j.upper() for i, j in zip(range(1, 3), 'abc')}
#{1: 'A', 2: 'B', 3: 'C'}
s = {x * x for x in range(10)}
#{0, 1, 64, 4, 36, 9, 16, 49, 81, 25}
- zip
把传入的参数打包成一个个元组,然后返回由这些元组组成的对象,以节约内存。可以使用 list() 转换zip对象以输出列表。
>>>list(zip(range(1, 3), 'abc'))
[(1,''a'),(2,'b'),(3,'c')]
while循环
while <条件语句>:
pass
break
退出循环
continue
提前结束本轮循环,直接开始下一轮循环
函数
def 函数名(参数):
<函数体>
- pass
占位符,防止 条件执行/循环执行/函数体/类 为空时报错
本身没有作用,不会影响后续代码执行 - 默认
return None
,返回值为tuple时可省略括号
参数
对于任意函数,都可以通过类似func(*args, **kw)
的形式调用它,无论它的参数是如何定义的。
- 函数的参数可以设置默认值
默认参数必须指向不变对象,否则每次调用都会指向上次调用结束时的默认值 - 位置参数(必选参数)
普通的参数称为位置参数,不可多传也不可少传(除非设置了默认值) - 可变参数
*
类似ES6的...
,自动将所有参数组装为一个tuple
def calc(*numbers):
sum = 0
for n in numbers:
sum = sum + n * n
return sum
calc(1, 2)#5
calc(*[1,2])#5
calc(*(1,2))#5
calc()#0
- 关键字参数
**
自动将含参数名的参数组装为一个dict
def person(name, age, **kw):
return name, age, kw
print(person('Adam', 45, gender='M', job='Engineer'))
print(person('Adam', 45, **{'gender':'M', 'job':'Engineer'}))
#(Adam , 45 , {'gender': 'M', 'job': 'Engineer'})
- 命名关键字参数
通过分隔符*
,*
后面的参数被视为命名关键字参数。
类似位置参数,不可多传也不可少传(除非设置了默认值),区别在于必须传入参数名而非通过位置传入
def person(name, age, *, city, job):
print(name, age, city, job)
person('Jack', 24, city='Beijing', job='Engineer')
#Jack 24 Beijing Engineer
- 参数组合
必须按照 必选参数、默认参数、可变参数/命名关键字参数、关键字参数 的顺序定义参数
def f1(a, b, c=0, *args, **kw):
print('a =', a, 'b =', b, 'c =', c, 'args =', args, 'kw =', kw)
f1('aa','bb','cc','dd',args1=1,args2=2)
#a = aa b = bb c = cc args = ('dd',) kw = {'args1': 1, 'args2': 2}
网友评论