python基础
运算
//
是下取整
py的浮点数也没有大小限制,但是超出一定范围就直接表示为inf
条件语句与循环
if xxx:
, elif:
, else:
, 'for x in xxx:' , 'while xxx:` 都和c一致
for else语法
for xx in xx:
blabla
else:
blabla
是指假如循环没有被中途break出来,整个循环结束后进行什么。
这感觉还是挺常用的,不需要在进循环之前定义一个flag然后出来之后if flag之类的
数据类型
存储地址
获取地址id(...)
,如果重了变量名就不能用了
对于简单类型,如int,float
在比较小范围[-5,256]的整数已提前存放于内存中,无论多少次重启地址都不变
其余的比如你重复调用id(1.1)
是不会变的,但如果你执行a=1.1
,再调用id(1.1)
就会出现不同的结果
而id(a)
为最初的地址,下一次赋值b=1.1
时id(b)
就会变成第二种id(1.1)
然后再调用id(1.1)
又变成了另一个值
由于类型简单,不用担心说a=1, b=a, b=123456
之后a改变,因为b=123456
相当于获取了新地址
而像list,set,dict这种.a=[1,2], b=a, b[0]=3
是会改变的
本质上b[0]访问的是a里的东西,改变了b[0]的地址,而a,b的地址仍然和最初的a一样
而前面b=123456
不会改a,是因为改的不是b的内部变量。
也就是说,如果写a=[1,2], b=a, b=[2,3]
这样子,a是不会改变的。
python中=
只是取地址。 b=a.copy()
才是真正复制两份
函数传参时,传的也是引用, 返回值也是引用, 也会出现和上面一样传入list
被修改的情况
全局变量与局部变量
python说是不允许再函数内部修改全局变量。
当全局变量a=1
时,函数里不能写a+=1
当全局变量a=1
时,函数里如果写a=2
,会视a为函数内的一个局部变量
当全局变量a=1
时,函数里写print(a)
是可以做到优先找局部找不到找全局的,但如果函数之后定义里a为局部变量,就会报错 local variable 'a' referenced before assignment
当全局变量a=[1,2]
时, 函数里可以写a[0]=3
,注意和a=1
时的不同
当函数中a未被视为局部变量之前,可以用global a
来声明函数内之后用的a都是全局的.
(语法上不能global a = 2
,必须分开写
字符
注意:不可变类型,不可以str[x]='a'
所以要修改字符串,要么先list(str)
再str=''.join(l)
,要么s=s[:i]+'a'+s[i+1:]
在计算机内存中,统一使用Unicode编码,当需要保存到硬盘或者需要传输的时候,就转换为UTF-8编码
用记事本编辑的时候,从文件读取的UTF-8字符被转换为Unicode字符到内存里,编辑完成后,保存的时候再把Unicode转换为UTF-8保存到文件
字符函数ord()
, chr()
str(1.23)
转字符串
字符串函数len(str)
print('Hi, %s, you have $%d.' % ('Michael', 1000000) )
字符串中用%%
来表示一个%
'abc''def'
或abc
+def
连接字符串,如果是字符串变量,用后者.
a
*n将n个字符串连接
int(str)
字符串转整数
str.strip('abc')
去掉紧贴两边且连续着的‘abc’。括号里什么也不写则去空格
str.replace('a','b')
换字符
list
a = ['a', 'b', 'c',1, 2]
内部元素数据类型可不同
元素个数len(a)
读取方式a[i]
a[-n]
是倒数第n个元素
a.append(element)
同pushback
a.extend(list)
将括号里的list接到原个list后面
a.pop()
即popback
a.sort(key=None,reverse=False)
排序默认从小到大,key用法是比如list里都是二元组,key=lambda x:x[1]
tuple
a=(1,2,3,4,5)
dict
d = {'Michael': 95, 'Bob': 75, 'Tracy': 85}
d['Bob']
用法同map
d.get(xxx)
同map.find()
d.pop(xxx)
同map.erase()
set
s = set([1, 2, 3, 1, 2, 3])
重复元素自动去重
x in s
返回bool值表示x是否在集合s中
s.add(xxx)
同set.insert()
s.remove(xxx)
同set.erase()
s1 & s2
, s1 | s2
def函数
f(a=1,b=2,c=3)
时如果想f(1,2,4)
只需写f(c=4)
可变参数*x
相当于接受一个tuple(可为空)
如果传入list或tuple则使用f(*a)
, 免得它把你那个看成一个更大tuple里的仅仅一个元素
关键字参数**x
相当于接受一个dict(可为空)
(注意这里以key=value的形式传入,其中key只能是合法的变量名称,如user,password,不带引号,但存成字符串)
如果传入dict则使用f(**d)
,免得它把你那个看成一个更大的dict里的仅仅一个元素
return (a, b, c)
a,b,c = f()
或(a,b,c)=f()
或L=f()
pass
占位,待写
eval
传入字符串,进行表达式计算
不要直接用eval()
处理input数据
会被__import__('os').system(rm -rf *)
之类的黑