Python Note
- 在解释器中(terminal)退出
exit()
- 缩进:四个空格
- 常用方法<p>1.
input()
,input()返回的是字符串,如果要提取数字,那就得类型转换啦,可以用int()b=input('number:') n=int(b)
<p>2.reng(number)
生成一个整数序列 - 字符串内部有很多换行,不好阅读的情况下:
'''content'''
eg:print('''line1 line2 line3''')
- 变量,没有固定的类型,可以赋不同类型的值
- 通常用大写表示常量(其实也是可以变的)
- 精确的除法(结果为浮点数)
/
- 地板除(结果为整数,只取整数部分)
//
- 余数
%
- 在文件的开头应该写这两句<p>
#!/usr/bin/env python3
告知系统,这是一个python可执行程序<p># -*- coding: utf-8 -*-
告知python解释器,按照utf-8读取源代码 - 格式化字符串(和C语言一样):<p>%s:字符串替换(永远起作用)<p>%d:整数替换<p>%f:浮点数替换<p>%x:十六进制整数
- [list](数组啊)常用方法:<p>1.len(list)取长度<p>2.append()追加
list.append('meng)
<p>3.insert(index,content)插到指定位置<p>4.pop()删除末尾的元素list.pop(index)
<p>5.替换,直接赋值就可以<p>6.list的数据类型可以不同,也可以嵌套list - (tuple)(有序列表),特殊的是一旦初始化,就不能改啦!注意:<p>1.定义的时候就得初始化
t(1,2)
或者t()
<p>2.只有一个元素的时候,必须写成t(,1)
要加个逗号,不然谁知道你这是小括号还是tuple<p>3.tuple的不变,指的是它的指向永远不变,比如说它的第二个元素是一个list,list的值是可以改变的,此时也不会报错,因为tuple指向的还是list这个元素,里面的值变了是可以的(指针呐!) - 关于代码块:<p>没有大括号,就是
:
加缩进,来表示他们是一个代码块的 - 条件判断:<p>特别的一点就是有个elif,else if的缩写(杀马特风)
- 循环:<p>第一种
for...in
循环<p>name=['meng','liang'] for item in name:print(item)
和js的循环很像啊,遍历了每个元素<p>第二种while
循环 - 字典
dict
(其实就是对象,键值对):<p>语法:<p>定义d={'meng':1,'liang':2}
<p>赋值d['meng']
<p>取值d.get('meng')
如果不存在也可以返回一个自定义的value,作为get的第二个参数d.get('meng',0)
这样不存在的时候,返回0<p>删除d.pop('meng')
<p>确定某个值是否存在'meng' in d
会返回true或false<p>注意:不能让可变的对象作为key,(也就是‘属性名’不能变,得是常量) -
set
,和字典类似,但是不存储value,key也不能重复(就是属性名)<p>创建:需要提供一个list作为输入集合s = set([1,2,3])
,重复的自动被过滤,就是添加几个都是显示一个<p>添加元素:add()
方法s.add(4)
<p>删除元素:remove()
<p>set可以看成数学上的无序和无重复元素的集合,可以做交集并集操作 - 函数<p>定义函数:
def
egdef my_function(x):略
<p>空函数def nop(): pass
占位符,比如先放在那里,函数也可以跑起来,不报错<p>参数类型检查isinstance(x,(类型))
,eg:isinstance(x,(int))
参数不正确可以抛出错误<p>返回‘多个’值,return a,b
本质是返回了一个tuple<p>参数:<p>特殊名词:<p>位置参数(positional argument),意思就是说传进来的参数一一对应。<p>默认参数,可以有自定义的值,默认参数在后,位置参数在前。<p>可变参数,也就是参数是一个list或tuple,写的时候参数前面加一个*def cal(*nums)
,表示把nums的锁欧元素作为可变参数传进去,好像很重要,记住,这样就可以传进来列表了(也就是数组)。<p>关键字参数,person('jack',24,**extra)
extra是一个dict,这就代表把extra里面所有的key-value都传进去了,灵活。<p>命名关键字参数,好烦,没看完 - 切片操作,也就是取一个list或者tuple的一部分<p>切片操作符
[startindex:endindex:间隔]
,包含开始的,不包含结束的.支持负数<p>字符串也可以用切片操作符'ABCD'[:3]
- 迭代,
for...in...
理论上只要是可迭代对象就可以来迭代,判断一个对象是可迭代对象的方法:<p>通过collections模块的Iterable类型判断isinstance('abc',Iterable)
返回true或者false,注意,要引入collections模块。<p>高级写法:for index,item in someList
index代表索引,item代表元素值 - 列表生成式(太高大上了)<p>最简单的列表生成:
list(range(1,11))
生成[1,2,3,4,5,6,7,8,9,10]<p>复杂一点的列表:[x*x for x in range(1,11)]
就生成了[1,4,9...]这样的列表,要生成的元素放在前面,后面跟for循环,就可以了。 - 生成器,它存在的意义在于并不是真真正正在内存存储一个列表,而是类似一种套路,然后可以通过for来遍历它,取自己需要的内容,比较省内存,可发展。<p>
yield
关键字,如果函数定义中包涵yield,那么他就不是一个普通的函数啦,而是一个generator,yield相当于return+print,遇到就返回,还打印? - 迭代器,可以被
next()
函数调用,并且不断返回下一个值的对象,成为迭代器:Iterator
,生成器都是Iterator对象,list、dict、str虽然可迭代,但不是迭代器对象,变成迭代器对象可以用iter()
函数 - 高阶函数,也就是行参接受一个函数作为参数(这不就是js回调函数么)
-
map()
函数,接受两个参数,一个是函数,一个是Iterable,map将传入的函数依次作用于序列的每个元素,并把结果作为新的Iterable返回,也就是取代原来的每个item。 -
reduce()
函数,也是接受两个参数,一个函数,一个序列,reduce(f,[a,b,c]]) => (f(f(a,b),c)
f函数必须接受两个参数,好奇怪@_@ -
filter()
函数,用于过滤序列。接受一个函数和一个序列作为参数,把传入的函数作用于每个元素,根据返回值(true或false)来决定保留还是丢弃这个元素。 -
sorted()
函数,排序函数。sorted()
函数可以对list排序,它也是一个高阶函数,接受一个key
函数来实现自定义的排序,这个函数可以变吗? - 高阶函数之返回值为一个函数,里面还有闭包的概念,用到在看吧
- 匿名函数:
lambda x : x*x
lambda来表示是匿名函数,x为参数,:后面就是‘函数体’,只能有一个表达式,不用写return - 装饰器,在函数运行期间动态增加功能的方式。本质上就是一个接受函数的高阶函数而已。有点意思,用的时候好好看一下
对于返回一个函数的函数,终于理解了,就是按顺序执行的意思,看return的包裹关系就知道,最外面的先执行,然后里面的执行!!!
- 偏函数,没看懂
- 模块,任何模块的第一个字符串都被视为模块的文档注释。
- 安装模块:
pip install packageName
- 类,又是类!!!!<p>定义一个类:
class Student(object)
,object代表它继承自哪个类,如果没有就写object<p>创建实例:bart = Student()
类名+()实现的<p>init函数,如果一个类,有一些必须绑定的属性强制的填写,那么可以定义这个方法,在类的内部def _init_(self,name,score):self.name=name(到底怎么样才能写这个代码块啊!好烦)
注意第一个参数永远都要是self,self代表创建的实例本身。<p>数据封装,就是类的方法,类的方法的第一个参数必须是self,代表实例本身。<p>访问限制,要想让内部的属性不被外部访问,可以把属性的名称前加上两个_
,就变成了一个私有变量,这样就直接拿不到了,但是也是可以改的,可以在类内部通过设置一个更改的函数,然后再去调用就可以了。就是曲折了一点。。。。<p>所谓多态,就是说当子类和父类有一个同名函数的时候,子类执行的是自己的,父类执行的是自己的<p>获取对象信息。type(some)
,可以知道这个对象是什么类型。返回值是对应的类型。dir(some)
获得一个对象所有的属性和方法,返回一个包含字符串的list,hasattr()\setattr()\getattr()
三剑客。<p>实例属性和类属性:实例属性可以通过实例变量或者self
变量来绑定;类属性直接在类里面写就行了name = 'student'
,这样直接写就可以啦!<p>限制类实例的属性,__slots__
:在定义类的时候,__slots__=('name','age')
这样在给实例绑定属性的时候,除了这两个别的都不可以。仅对当前类的实例起作用,对继承的子类是不起作用的。<p>@property