读21python

以前自学21天学通Python的笔记:
1:一般来说:行尾的“:”表示下一行代码的开始,
复杂代码里在分支语句里使用缩进,通过缩进分层的结构也非常清楚。值得注意的是,同一级的代码缩进量要保持在一致,在python的编程规范指出:缩进量从右开始缩进4格
在python代码里,一句语句过长或者为了结构清晰而不能或不方便写在一行的可以使用"\"将该行以后的内容写入下一行,而"\"则不允许有任何内容,可以,end=""不换行
print("i am",\
"i can",\
"i can")去掉\也可以,也是正确,因为python规定了圆括号的部分也可以写在不同行,不过在用\续行的时候,后面不能放注释,字符

2:python和其他语言一样,不能省略乘法符号的,省略会报错

3:单引号和双引号本质上是一样的,但是但字符串内含有单引号的时候,使用单引号就会导致无法区分字符串内的单引号和字符串标志的单引号,需要使用转义字符

4:string(字符串名).isalnum() 检测字符串是否只包含0-9,a-z,A-Z
string.isalpha() 检测字符串是否是只包含a-z,A-Z
string.isdigit()检测字符串是否只包含数字
    string.islower()检测是否均为小写
    string.lower()全部转化为小写
    string.isupper() 均为大写
    string.upper()转化为大写
    string.istitle() 检测是否为首字符为大写
    string.title()
    string.swapcase()大小写转换
string.join()函数将原函数插入参数函数每两个字符之间,如果参数字符串只有一个字符,则返回参数字符串,join不改变原字符串,只是返回一个新的字符串
print('e'.join('abcd'))
返回aebecede

5:整数int 
0o[0O]表示八进制(0o24,0O24)
0x[0X]表示十六进制(0x3D,0X3D)
0b[0B]表是二进制(0b101,0B101)
每种进制的开头都是0开头,但是进制不能以0开头书写

6  整数运算符

** 乘方运算符
*乘法
/除法
//整除

7 在原始字符串前面加r或者R作为标志,可以不转义

8 格式化输出,%格式化输出,
%d 十进制
%s 字符串
%x 16进制,字母小写
%X 16进制,字母大写

8 标识符(biaoshifu),是大小写敏感的,大小写不同表示不同的变量名

9 python的数据类型:
列表(list):
1:列表把大量数据放在一起,可以对其进行集中处理,不仅可以方便处理数据,还可以减少声明很多变量
列表是方括号"[]"包围的数据集合,不同成员以","分隔,可以存放任何数据类型,也可以包含另一个列表,可以通过序号来访问其中的成员

list.append()
list.count(x)返回X出现的次数
list.extend(L)追加一个列表L
list.index(x)返回x的下标,不存在则报错
list.insert(index,data)想指定下标插入数据

在列表操作中,并不返回列表,只是修改列表

2:元祖 tuple
建立就不能修改,可以通过下标来引用,只建立一个元素的元祖,元素后面需要有","

3 字典,在python很特殊,字典的成员以“”键:值“”的形式存在,以{}包围的键值对 方式声明和存在的数据集合,与列表最大的不同就是字典是无序的,成员位置只是象征性的,字典通过键来访问成员,而不能通过位置来访问该成员
dict.clear()
dict.copy()
dict.get(k,default)   如果存在这个值K,返回default
dict.get("a")没有返回None,有就返回a的值
dict.items()
dict.keys()
dict.values()
dict.setdefault(键),没有则创建一个None,有就返回值

10:序列的切片指的是形如[start:end:step]来取序列中的部分成员函数数据项,从序列的start序号开始到end前一个结束,每隔一个step来取一个成员
alst[:] 取全部成员数据项
alst[0:]  取全部成员数据项
alst[:-1] 取除了最后一个成员之外的所有成员数据
alst[::-1] 快速逆置
alst[5:0:-2] 从5至0(不包括0),从右至左每隔一个成员取一个成员,得到[5,3,1,]
左闭右开的区间:

11:
max(),min()要求序列中的元素可以比较大小,sum函数要求序列中的元素只能是int或者float类型
字符串的两端需要有相同的符号,如内部有与两端符号相同需要转义。
 0897不是python里的整数,原因是十进制不能以0开头
not 总是返回True或者False
切片:[0,1,2,3][1:3] 其实也就是类似于s[1:3]表示切片,切[0,1,2,3]从1切到3,也就是1,2

控制语句执行流程:
流程控制语句:
用for循环:
for 与 range():
用while循环
增量赋值运算符
for语句对于遍历列表、元祖、字符串的基本形式是相同的,对字典的遍历有些不同,因为字典既有键又有值,在遍历时,不能直接对字典进行遍历,而是通过字典的items(),keys(),values()等方法分别遍历键和值、键、值。
在遍历的时候,可以使用两个循环变量来分别接收键和值

break 语句是中断循环的执行,在for里执行了break语句,for 语句的遍历就会立即终止,即使还有未遍历完的数据,还是会立即终止for 循环语句
continue 是提前停止循环体的执行,开始下一轮循环,在for里如果执行了continue语句,则continue 语句后的循环语句不会立即被执行,而提前结束,进行下一个遍历 
输出结果:
 
break的是这整个循环,continue跳出当前循环
for 语句使用range()函数可以构建基于一直循环次数的循环程序,也可以以range()生成的数字作为索引来访问列表,元祖,字符串中的值,还可以对遍历的序列实行处理,以得到相关的数据
range()函数并不是在调用时一次生成整个序列,而是遍历一次才产生一个值,以减少内存的占用,其本质是一个迭代器
和if一样,for也可以嵌套

增量赋值运算符:
x += 1
x = x+1
增量赋值运算符可以写的简单点,

推导式:list comprehension
[<1,相关表达式>for i in range()]
range()也可以换作一个可遍历的对象,比如列表,元祖
每当对列表, 元祖,字典序列中的元素进行处理时,都可以尝试用列表推导式来完成,这样非常有利于降低程序的复杂性,即使程序清晰易懂,缩短程序长度
推导式进阶:
[<i相关表达式> for i in range() if <条件>]
 range(a,b,c)a表示起始位,b表示终止位,c为step步长
匿名函数
lambda x,y :x+y
10,20,lambda x,y: x+y

12
参数的传递
      在python里参数的传递是按照声明函数时参数的位置顺序来进行传递的,即位置参数,调用时提供的第一个参数值会被声明时的参数列表中的第一个参数获取,其他的参数结合方法类推,在python里还提供了一种传递参数的方法----按照参数名传递值的方法,即提供关键参数,提供关键字参数的函数调用类似于定义函数时设置参数的默认值。
      提供关键字参数调用参数时,要在调用函数名后的圆括号写出形式为“”关键字=参数值“”的参数,这样,调用函数时提供参数就不必严格按照该函数声明时的参数列表的顺序来提供调用参数了,如果在函数调用时,既提供了关键字参数,又提供了位置参数,则位置参数会被优先使用,如果参数结合时出现重复,则会发生运行错误

调用函数在提供参数时,按顺序传递的参数要位于关键字参数之前,而且不能有重复的情况
一般来说:定义的函数,如果既有无默认值的函数,又有有默认值的函数,应当把有默认值的参数放在后面,这样在调用函数时,前面的无默认值的参数可以依次取得调用时所给的值,对于默认值参数,没有依次取得时,就使用默认值,给函数调用带来很大的方便
*args 元祖类型
**kwargs 字典类型

def mysum(a,b):
return a+b
print("拆解元祖调用:")   #调用时拆解元祖作为位置参数
print(mysum(*(3,4)))
print("拆解字典调用:") #调用时拆解字典作为关键字参数
print(mysum(**{"a":3,"b":4}))

拆解元祖:
7
拆解字典:
7

面向对象变成概述:
面向对象编程就是通过面向对象分析和设计,建立模型并最终完成程序的过程,
对象优越性:
封装、继承、包含


如果在类中定义了函数,也可以用类实例来调用它

一般来说,为了区分在类中定义的函数和类外定义的全局函数,将类中定义的函数称为方法

类的方法是为了类的能力建模,在类外部调用该类的方法可以完成对应的功能,或者改变类的状态,或达到其他目的

类中方法定义和调用与函数定义和调用的方式基本相同,其区别有:

1 方法的第一个参数必须是self,而且不能省略
2 方法的调用需要实例化类,并以实例名.方法名(参数列表)形式调用;
3 整体进行一个单位的缩进,表示其属于类体中的内容

定义方法的时候,也可以像定义函数一样声明各种形式的参数;方法调用的时候,不用提供self参数
在python语言的类定义中,可以定义一个特殊的构造方法,即__init__()方法,用于类实例化时初始化相关数据,如果在这个方法有相关参数,则实例化必须提供

__init__方法名中init前后各两个下划线

类的属性:
类的属性是对类进行建模必不可少的内容,方法是用来操作数据的,而操作的大部分数据都是类自身的属性,以改变类的状态,
它们是在构造方法中以直接赋值的方式定义的,因此python中定义属性就是先直接使用它,可以在构造方法中定义属性,也可以在类中的其他方法使用定义属性
1  实例属性
2  类属性
实例属性即同一个类的不同实例,其值是不相关联的,也不会互相影响,定义使用“self.属性名”,调用也使用它;

类属性则是同一个类的所有实例所共有的,直接在类体中独立定义,引用时要使用“类名.类变量名”形式来引用,只要是某个实例对其修改,就会影响其他所有这个类的实例


1 setattr():
setattr()表示你可以通过该方法,给对象添加或者修改指定的属性。
setattr()方法接受3个参数:setattr(对象,属性,属性的值)
2 delattr():
而delattr()表示你可以通过该方法,删除指定的对象属性。
delattr方法接受2个参数:delattr(对象,属性)

3hasattr()函数
用于判断对象是否存在对应的属性
语法

hasattr(object,name)
参数 object--对象,name--字符串,属性名
如果有对象该属性值返回True,否则返回False


str对象和bytes对象可以使用.encode()(str ->bytes)or.decode()(bytes ->str)方法可以相互转化


13 递归函数
def  jiecheng(num):
    if num==1;
        return 1
    return num*jiecheng(num-1)
递归的优点是定义简单,逻辑清晰,
缺点是过深的调度会导致栈溢出
针对尾递归优化的语言可以通过尾递归优化防止栈溢出,尾递归实际上和循环等价.但绝大部分语言没做尾递归优化,python也没有,所以用尾递归优化了,依然会出现栈溢出

尾递归优化:
def dig(n):
    return digui1(n,1)
def digui1(num,pro):
    if num==1:
        return pro
    return digui1(num-1,num*pro)
print(dig(5))


理论上所有的递归函数都可以写成循环形式,但是循环不如递归清楚



14 类:
类在定义后必须先实例化才能使用,类的实例化跟函数调用类似,只要使用类名加圆括号的形式就可以实例化一个类
类实例化以后会生成该类的一个实例,一个类可以实例化成多个实例,实例与实例之间不会互相影响

1 方法:
一般来说,为了区分在类中定义的函数和类外定义的全局函数,将类中定义的函数成为方法

类中方法定义和调用与函数定义和调用的方式基本相同,区别有:
1  方法的第一个参数必须是self,而且不能省略
2 方法的调用需要实例化类,并以实例名.方法名
3 整体进行一个单位的缩进,表示其属于类体中的内容

定义方法时,也可以像定义函数一样声明各种形式的参数;方法调用时,不用提供self参数。

在python里的 类定义中,可以定义一个特殊的构造方法,即__init__()方法,用于实例化初始化相关数据,如果在这个方法中有相关参数,则实例化就必须提供


2 python中类的属性有两类:
(1)实例属性
(2)类属性

        实例属性即同一个类的不同实例,其值是不相关联的,也不会相互影响,定义时使用“self.属性名”,调用也使用它;

        类属性则是同一个类的所有实例所共有的,直接在类体中独立定义,引用时要使用“类名.类变量名”形式来引用,只要是对某个实例对其进行修改,就会影响其他的所有这个类的实例



15:匿名函数:
list(map(lambda x:x*x,[1,2,3,4,5,6,7,8,9]))

def f(x):
    return x*x

关键字lambda 表示匿名函数,冒号前的x表示参数
匿名函数有一个限制,就是只能有一个表达式,不用写return,返回值就是该表达式的结果

好处是没有名字,不用担心函数重名,而且匿名函数也是一个函数对象,可以把匿名函数赋值给一个变量,再利用变量来调用该函数


16 装饰器:


17:判断是否可迭代
    通过collection 里的Iterable类型判断
    >>>from collections import Iterable
    >>>isinstance('abc',Iterable)
    True

可以被next()函数不断调用并不断返回下一个值的对象称为迭代器:Iterator

生成器都是Iterator对象,但是list,dict,str虽然是可迭代Iterable对象,但是却不是Iterator对象
可以用iter可以变成可迭代对象

凡是可作用于 for 循环的对象都是 Iterable 类型;
凡是可作用于 next()函数的对象都是 Iterator 类型,它们表示一个惰性
计算的序列;
集合数据类型如 list、 dict、 str 等是 Iterable 但不是 Iterator,不过可
以通过 iter()函数获得一个 Iterator 对象。


    python内置的enumerate函数可以把一个list变成索引-元素对,这样就可以在for循环中同时
迭代索引和元素本身:
    for i,value in enumerate(['A','B','c']):
          print(i,value)
    0 A
    1 B
    2 C
    
    s=[x+y for x in "ABC" for y in "XYZ"]
        print(s)


18 生成式和推导式
生成器generator
1    第一种方法就是把列表生成式的[]换成()

G=[x*x for x in range(10)]
print(G)

G=(x*x for x in range(10))
print(G)
<generator object <genexpr> at 0x005C5390>
取值为:
    next(G)
    但是一直next太费事,可以用循环
遍历
 
2 第二种方法:
如果一个函数定义中包含yield关键字,那么这个函数不再是一个普通函数,而是一个generator



19  高阶函数:
把函数作为参数传入,这样的函数称为高阶函数,函数式编程就是指这
种高度抽象的编程范式。
def add(x,y,f):
    return f(x)+f(y)
a=add(5,6,abs)
print(a)





猜你喜欢

转载自blog.csdn.net/lvluobo/article/details/81008600
今日推荐