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.1id(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 *)之类的黑

posted @ 2019-06-30 17:12  _zwl  阅读(182)  评论(0编辑  收藏  举报