python学习小结

系统 1548 0

#! /usr/bin/env python

# -*- coding: utf-8 -*-

 

# 注释

换行写代码 \

 

进制

十进制 123456789

二进制 0b123

八进制 0o123

十六进制 0x123

 

变量不用声明必须赋值

字符串 ' ' " " """ """ ''' ''' 用来括长字符串,保留换行格式

转义字符 \

\uxxxx 表示使用Unicode编码 # eg: "\u0040"

 

格式化字符串

在Python中很少用“+”进行字符串拼接,字符串只能和字符串拼接

print('a=',a)

创建字符串时指定占位符

b = 'sdasdasd%s'%'孙悟空'

b= 'dsadad%s%s'%('sdsad','sdad')

b = 'sdasdasd%3s'%'孙悟空' 最小填充3,不够前边补位空格

b = 'sdasdasd%3.5s'%'孙悟空' 最小填充3最长5,不够前边补位空格超出后边截尾

 

b = 'sdasdasd%s'%123

b = 'sdasdasd%.1f'%123.5

b = 'sdasdasd%d'%123

 

b = r'sadsad' #字符串前加r表示,启用原始字符串模式,转义字符串等失效

 

%s%f%d

 

格式化字符串

c=f"hello {a} {b}"

 

print('a=',+a)

print('a=',a)

print('a=%s'%a)

print(f'a={a}')

print("adas",end="")

a="小米" * 20 #字符串乘以数字,字符串复制

 

boolean值 True False

bool python简写

None 空值

 

类型检查

c=type(变量) #用来检查值的类型

对象 id #内存地址 id()

type #类型 功能 type()

value #值

a 可变对象

123 不可变对象

 

int()

float()

bool() # '' 0 None

str()

 

算术运算符 +-*/ // #整除 ** 幂运算 %

赋值运算符

关系运算符 < > <= >= == != is is not #比较两个对象是否为同一对象

逻辑运算符 not and or

非布尔值进行逻辑运算时,Python会将其当成boolean值运算,返回原值

逻辑运算符可以连号 result = 1 < 2 < 3

条件运算符

语句1 if 条件表达式 else 语句2

max = a if a > b else b

 

流程控制

条件判断语句(if)

语法 : if 条件表达式 : 语句

代码块缩进管理多行

input(['参数'])

语法: if 条件表达式 :

代码块

else :

代码块

 

语法: if 条件表达式 :

代码块

elif 条件表达式 :

代码块

elif 条件表达式 :

代码块

elif 条件表达式 :

代码块

else :

代码块

 

 

 

循环语句

while

语法:

while 条件表达式 :

代码块

 

while 条件表达式 :

代码块

else :

代码块

 

break

continue

pass #占位

 

模块引入

from time import *

time()

 

序列

列表 list [ ]

python列表可以存放任意数据

以下为通用操作对字符串有效

len(s)

index可以是负数,倒数 eg:-1 倒数第一个

切片获取 list[start:end] #包括起始位置,不包括结束位置

起始位置和结束位置都可以省略

list[:]

list[start:end:步长] #步长不能是0,可以是负数,负数为逆序

list + 列表拼接 * 复制

in not in 检查是否存在

print('dd' in list) # True False

min(list) #获取最小值

max(list) #获取最大值

s.index()

s.count(s[0]) #统计指定元素出现的次数

序列——————有序

可变序列

list

不可变序列

str

tuple #元组

 

可变序列可修改

索引修改

del s[2] # 删除

切片 s[:] ##从头到尾切片,获得副本

切片替换 s[0:2] = ['s','w','w'] #可以多个替换一个

s[0:0] = 'd' # 索引0位置插入

s[::2] = ['s','s'] #设置步长时,赋值双方list 数量一致

del s[::2] #切片删除

s[0:2]=[] #赋值空来删除

 

不可变序列

s=list(s) #强制转换

 

可变序列方法

s.append(str) #添加元素

s.insert(i,x) #插入元素(非替换)

s.extend() #使用新序列扩展当前序列 【添加有个序列】

s.clear() #清空序列

s.pop(index) #根据索引删除返回被删除对象

s.pop() #删除最后一个

s.remove(x) #删除指定值,【删除第一个】

s.reverse() #反转

s.sort() #排序

s.sort(reverse = True) #排序

s.copy() s[:] ##制作副本的两种方法

列表遍历

for 变量 in 序列 :

代码块

 

range([start],end,[step]) #生成自然数的序列的函数

r = range(5) #[0,1,2,3.4]

list(r)

 

!!!! python 里的for循环

for i in range([start],end,[step]) :

代码块

else

break;/continue

 

 

tuple 元组 ()

创建

my_tuple = ()

my_tuple = 1,2,3,4 #元组不为空括号可以省略

my_tuple = 1,

#元组的解包(解构)

a,b,c,d = my_tuple

a,b = b,a #变量交换

a,b,*c = my_tuple # *c获得剩余元素,像指针

##也可以对列表和str解包

 

可变对象

 

== != #比较值 is is not #比较对象

 

字典 dict

item项

key-value

创建

d = { }

语法:

d = { key:value,key:value }

d = dict(key=value,key=value) #dict 函数

双值子序列

[1,2] (1,2) #双值

[(1,2),(3,5)] #子序列

d = dict( [(1,2),(3,5)])

len(变量)

in

not in

'hello' in d #查看键是否存在

d[key] # key必须加引号

d['key'] = value #没有的可以添加,不能读取

setdefault(key[,default]) #添加字段,设置默认值

result = setdefault(key[,default]) # result 返回实际值

update([other])

eg:

d1={'a':1,'b':2}

d2 = {'c':3,'d':4}

d1.update(d2)

d1 = {'a':1,'b':2,'c':3,'d':4} #重复key会被d2替换

del d[key] #删除

####方法

popitem() #随机删除一个item元素(一般删除最后一个)返回两个元素的元组,被删除的那个

pop(key[,default]) #删除指定的,返回删除的值

#写上默认值没有不报错,返回默认值

clear() #清空

copy() #对字典进行浅复制 只复制值,不会进行智能级联复制

遍历字典:方法

keys() :

for k in d.keys() :

d[k]

values() :

for v in d.values() :

v

items() :

for k.v in d.items() :

k v

 

集合(set) { }

存储不可变对象 无序 不重复

s = {1,2,34,4}

s = set() #空集合

s = { } #空字典

s = set(序列或者字典) #转换为集合

s = set(字典) #保留的集合体是键

in not in

'a' in s

len(s)

add() #集合中添加

s.add(10)

update() #讲一个集合中的所有元素添加到集合中

s.update(s2) #s2可以是集合,序列,字典

pop()随机删除一个集合中的元素,并返回这个元素

s.pop()

result = s.pop()

remove() #删除指定元素

s.remove(100)

clear() #清空

s.clear()

copy() #对集合进行浅复制

 

集合运算

s1={1,2,3,4,5}

s2={3,4,5,6,7}

& #交集

s3 = s1 & s2

| #并集

s3 = s1 | s2

- #差集

s3 = s1 - s2 # s3 = {`,2}

^ #异或集

s3 = s1 ^ s2 # s3 = {1,2,6,7}

<= #检查一个集合是否为另一个集合的子集

a <= b # true a是b的子集,b是a的超集

< #检查一个集合是否为另一个集合的真子集

a

>= > #检查一个集合是否为另一个集合的超集

 

函数(function)

def 函数名([形参1,形参2,....形参n]):

代码块

调用函数 fn()

##函数的参数

在定义函数使,可以定义数量不等的形参,用‘,’隔开

def fn2(a,b):

a+b

def fn3(a,b=2) : # b=2 为默认值不传参数不报错,默认值生效

代码块

 

##调用时**

##位置参数一一对应

fn2(1,2)

##关键字参数

fn2(b=1,a=2)

##位置参数和关键字参数可以混合使用,,位置参数必须在关键字参数的前边

eg:

print('hello',end=' ') #防止换行

 

实参类型可以为任意类型 ##Python 不检查,所以Python函数中需要检查参数类型

 

在定义函数时,可以在形参前加一个* ,这样这个形参会获取所有实参,并保存为元组,“参数装包”

##不定长参数只能有一个,但可以配合其他参数

def fn(*a):

sum=0

for n in a :

sum+=n

print(sum)

 

def fn(a,b,*c):

 

所有带* 的参数后的参数必须以关键字参数传递

def fn(a,b,*c,d,e):

fn(1,2,3,4,5,d=6,e=7)

 

def fn(*,a,b):

##表明该函数必须以关键字参数传递

!!## *形参必须以位置参数传递,不能接收关键字参数

## “**” 形参可以接收其他关键字参数,他会将这些参数保存到一个字典中,字典的key为参数名,value为参数值

## **形参只能有一个,并只能放在所有形参最后

 

实参

参数解包(拆包) * 序列解包

#fn(1,2,3)

# t=(1,2,3) #序列都可以,元组或列表

fn(*t)

传递参数时也可以在序列的参数前添加星号,这样他会自动将序列中的元素依次作为参数传递

 

字典实参解包,用**解包

d={a:1,b:2,c:3}

fn(**d)

 

返回值

return :

return #100 or 变量

return None

return 结束函数

 

文档字符串(doc str)

help() #Python的内置函数,可以查询Python中函数用法

hellp(函数对象) #hellp(print)

--函数内部编写函数说明

--文档字符串,直接写在函数第一行的字符串

def fn(a:int,b:bool,c:str='hello') ->str : # 参数后冒号只是描述作用,也能看成文档字符串的一种;= 表示默认值 ; ->表示返回值

'''

doc str

'''

代码块

 

作用域(scope),命名空间(namespace)#变量存储位置

每一个作用域都有一个自己的命名空间

命名空间实际上就是一个字典,是一个专门用来存储变量的字典

locals() #用来获取当前作用域的命名空间

#如果在全局作用域中调用locals()获取全局命名空间

dict = locals()

scope = locals() #当前命名空间

scope['c'] = 1000 #向字典中添加key-value 相当于在全局变量中创建了一个变量

globals() #此函数可以在任意位置获得全局命名空间

scope = globals() #全局命名空间

递归 1.基线条件问题分解的最小条件,此时不再递归,直接返回

2.递归条件 将问题继续分解的条件

#基线条件,判断n==1 不再循环

10!=10*9!

9!=9*8!

......

2!=2*1!

1!=1

def fn(n) :

#基线条件

if(n==1):

return 1

#递归条件

return n*fn(n-1)

 

def hui_wen(s):

#基线条件

if len(s) < 2 :

return True

elif s[0] != s[-1] :

return False

return hui_wen(s[1:-1])

 

Python中函数是一等对象

函数式编程

 

高阶函数:接收一个或多个函数,将函数作为返回值返回

 

普通函数改变的返回值,得到返回值不影响原对象

 

【高阶函数1:参数是函数】

def fn(fnc,lst):

new_ls = []

for n in lst :

if fnc(n) :

snew_ls.append(n)

return new_ls

 

内置函数

filter(function,iterable) #参数:1方法;2可迭代

#过滤器

#参数

# 1.函数,根据此函数过滤 。True 为通过元素,通过过滤

# 2.需要过滤的序列(可迭代)

#返回值

# 过滤后的新序列(可迭代)

 

匿名函数 lambda函数表达式(语法糖)

#语法

lambda 参数列表 : 返回值

实例

1. def fn(a,b):

return a+b

2. lambda a,b : a+b

调用

(lambda a,b : a+b)(10,20)

3. fn = lambda a,b : a+b

调用

fn(10,20)

 

map()

map()函数可以对可跌倒对象中的所以元素做指定操作,然后将其添加到一个对象中返回

l = [1,2,3,4,5,6,7]

r = map(lambda i : i+1 , l) #i 为l中的元素

 

sort() #列表的方法

#该方法用来对列表中的元素进行排序,影响原对象

#sort()方法默认是直接比较列表中的元素的大小

#在sort()可以接收一个关键字参数,key

# key需要一个函数作为参数,当设置了函数作为参数

# 每次都会以列表中的一个元素作为参数来调用函数,并且使用函数返回值来比较元素大小

list.sort()

#是用“<”进行比较的

list.sort(key=len)

 

sorted() #与sort()使用方法一样

#对任意序列都可以排序,返回新对象

 

【高阶函数2】

返回值是函数

#闭包

def fn():

#函数内部定义一个函数

def inner():

print('晚上好')

return inner

fn()()

 

通过闭包可以创建只有当前函数可以访问的变量

 

# sum(list)/len(list) 求平均值

 

def make_averager():

#创建一个列表,用来保存数值

nums= [ ]

#创建一个函数,用来计算平均值

def averager(n) :

#将n添加到列表中 #nums=[] 不能放这里是因为重新new了,会为空

nums.append(n)

#求平均值

return sum(nums)/len(nums)

return averager

 

#闭包的形成->数据安全,隐藏外部变量

1.有函数嵌套

2.将内部函数作为返回值返回

3.内部函数必须要使用到外部函数的变量

 

装饰器

#OCP原则 开放对程序扩展,要关闭对程序的修改

###? 运用了闭包

-----------------------------------------------------------------------

def fn(old):

...

用来对其他函数进行扩展

...

def new_fn(*args , **kwargs): #对位置参数和关键字参数进行装包

xxxxxx #扩展代码

result = old(*args , **kwargs) #对位置参数和关键字参数进行解包

xxxxxx #扩展代码

return resukt

#返回新函数

return new_function

----------------------------------------------------------------------

调用

f= fn(fn1)

r=fn(fn2)

 

真实场景:

创建装饰器函数begin_end

使用

@begin_end #注解方式添加装饰器

def say_helllo():

print('大家好')

调用

say_hello()

#可以多个装饰同时使用

@begin_end #注解方式添加装饰器

@fn

def say_helllo():

print('大家好')

say_hello() #内装饰器先起作用,fn先起作用

 

面向过程,符合人类思想;函数式编程,复用性提高;面向对象,对象自己自己完成

 

 

##类class

#类的定义

构成:1数据(属性【一般保存到实例中】)2行为(方法【一般保存到类中】)

#语法 class 类名([父类]):

代码块

公共的属性。。

#对象初始方法

def __init__(self,....):

...

#其他方法

def method_1(self,....):

....

def method_2(self,....):

....

.........

class MyClass():

name='' #公共属性 相当于java中static类型,只有实例没有时,默认查找

def fn(self): #公共函数,类中的函数必须有一个形参

print(1) #函数无法访问类中的变量

print(MyClass)

#类方法(在类内部使用@classmethod来修饰的方法属于类方法)

@classmethod

class MyClass():

name='' #公共属性 相当于java中static类型,只有实例没有时,默认查找

@classmethod

def fn(cls): #类方法,也必须有一个形参cls,cls代表类对象

print(1) #函数无法访问类中的变量

print(MyClass)

#创建对象

mc = MyClass() #创建对象不像java一样需要new

# isinstance(object,Class) 函数检查一个对象是否为一个类 的实例

对象.属性= 值;

mc.myFunction() #调用类中方法时自动传一个参数(对象本身,和java中的this有点像)

#方法每次调用时第一个参数,默认为self

 

#类中可以创建一些特殊方法(魔术方法)

#特殊方法以__开头,以__结尾

#特殊方法不需要 我们自己调用,会自动调用

class Person :

def __init__(self):

print('a')

pass

def say_hello(self):

pass

 

p1=Person()

p1.say_hello()

 

对象创建流程

自上而下执行代码,先执行类中代码块

1创建一个变量

2在内存中创建一个对象

3_init_(self)方法执行

4将对象id赋值给变量

 

#可以为class中对象的属性定义时使用双下划线,__xxxx

#双下划线开头的属性,是对象的隐藏属性,隐藏属性只能类内部访问,不能通过对象访问(!=java中的private) __属性名 -> _类名_属性名

 

一般类中的私有属性用“下划线”+属性

 

get set 方法属性话

添加"属性"装饰器

get方法装饰器方法上边添加

@property

set方法装饰器

@属性名.setter

_# get方法先设计,才能设计setter方法

 

继承

Class 类名([父类]):

pass

isinstance(d,Object) #判断d是否为object的实例

issubclass(a,b) #判断a是否为b的子类

#类名.__bases__ 获得当前类的父类

##Python是多继承的(java是单继承的)

类名(父类,父类):

pass

#多个父类中有同名方法,先在第一个父类中找

 

多态

 

len()是因为对象中有特殊方法__len__()

 

类的属性和方法

#静态方法

@staticmethod

def fn():

pass #类中静态方法无参数

 

垃圾回收

自动垃圾回收机制(和java挺像的嘛,哈哈)

#del是一个特殊方法,他会在对象被垃圾回收前自动调用,回收的是类对象

def __del__(self):

pass

 

#特殊方法,魔术方法

双下划线开头结尾

一般不需要我们手动调用,一般在特殊情况下自动调用

__str__() :对象被打印时调用

__repr__() :在对对象使用repr()函数时调用,是在交互模式下自动调用,即在命令窗口a回车,输出a的值时调用

object.__lt__(self, other) <

object.__le__(self, other) <=

object.__eq__(self, other) =

object.__ne__(self, other) !=

object.__gt__(self, other) >

object.__ge__(self, other) >=

#判断大小

__len__() #获得长度

__bool__() #boolean 装换规则

object.__add__(self, other)

object.__sub__(self, other)

object.__mul__(self, other)

object.__matmul__(self, other)

object.__truediv__(self, other)

object.__floordiv__(self, other)

object.__mod__(self, other)

object.__divmod__(self, other)

object.__pow__(self, other[, modulo])

object.__lshift__(self, other)

object.__rshift__(self, other)

object.__and__(self, other)

object.__xor__(self, other)

object.__or__(self, other)

.....................

#运算特殊方法

 

模块化

#一个Python文件就是一个模块

#在一个模块中引入外部模块

1.import 模块名(Python文件名,不带后缀)

module为单实例

2..import 模块名 as 模块别名

import 可以在程序的任意位置调用,一般在开头

每个模块内部都有一个__name__属性。通个这个属性可以获得模块的名字

__name__为__main__的是主模块

#调用

模块名.变量名

3.只引入模块的部分内容

#语法

from 模块名 import 变量,变量,....

from 模块名 import 变量 as 变量别名

#调用

变量名

from 模块名 import *

#### 模块中 _变量 是隐藏变量,用from 模块名 import *不起作用

 

#测试代码

#只有单前代码为主模块时执行

if __name__ == '__main__' :

pass

 

包 package

import 包名

#包中必须有一个__init__.py 文件,其中有包中的主要文件

from 包名 import 文件名/模块名

 

#__pycache__是模块缓存文件

#py代码在执行时会转换为机器码,所以我们在使用模块时,也需要将模块代码转换为机器码,Python在编译一次后会放入缓存文件中

 

Python标准库

核心思想:开箱

sys模块,Python系统参数变量,操作解析器

import sys

1.sys..argv 获得解释器参数列表

print(sys..argv)

2.sys.modules 获得当前进程引入的所有模块(字典)

print(sys..modules )

#key 模块名,value 模块实例对象

3.sys.path 模块搜索路径的列表,即调用模块的搜索顺序

4.sys.platform 当前Python运行平台即系统环境

5.sys.exit([str提示]) 函数用来退出程序

 

pprint 模块 提供了pprint()方法,该方法可以对打印的数据做简单的格式化

pprint .pprint (数据)

 

os 模块,对操作系统进行访问

import os

1.os.environ 通过这个属性可以获得系统的环境变量

pprint .pprint (os.environ['path'])

2.os.system([str命令]) #执行系统自身的命令

3.listdir()

import os

from pprint import pprint

#os.listdir([path=''])获取指定的目录的目录列表(默认为当前目录'.')

r=os.listdir()

pprint(r)

4.os.getcwd()#获得当前所在目录

5.os.chdir([path])#切换目录

6.os.mkdir(path)#创建目录

7.os.rmdir(path)#删除目录

8.open('aa.txt','w')#创建文件

9.os.remove('aa.txt')#删除文件

10.os.rename('旧名字','新名字')#重命名或剪贴

os.rename('旧名字','新路径名字')

 

##异常

try语句

try:

代码块(可能错误代码)

except:

代码块(处理方式)

else:

代码块(没错误时执行代码,错误不执行)

 

异常的传播---抛出异常

产生异常时,实际上是创建了一个异常对象

 

try语句

try:

代码块(可能错误代码)

except NameError:

#如果except后边不跟内容,捕获所有异常

#如果except后边跟一个异常类型,捕获此类异常

代码块(处理方式)

except IndexError:

代码块

except [Exception]:

代码块

else:

代码块(没错误时执行代码,错误不执行)

 

 

try:

代码块(可能错误代码)

except Exception as e :

代码块(处理方式)

else:

代码块(没错误时执行代码,错误不执行)

finally :

代码块

 

try必须有,except 和 finally必须有一个

 

 

#抛出异常

raise

raise 语句后需要跟一个异常类或者异常的实例

if(a<0):

raise Exception('a为负数') #强行抛出异常

 

自定义异常类,创建类继承Exception

class MyException(Exception):

pass

 

文件(File)

1.打开文件

open()

open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)

默认是以文本模式打开(文本模式,二进制模式)

文本文件: encoding='utf-8'

操作模式:mode='r' # mode='w' 时,没有文件会创建,存在会截断; # mode='a' 追加内容,没有文件会创建,存在会追加内容 ;# + 追加操作,mode='r+',即可读又可写,mode='w+',即可写又可读,mode='a+',即可追加又可读; mode='x' 新建文件,如果文件存在报错,不存在创建,并可写入(可避免覆盖已有的);t 默认情况下,文本文件;b 二进制文件,mode='rb';

参数:file文件路径

file_object = open(路径) #返回文件对象

2.操作

content = file_object.read() #读取所有内容

@1 读取

#help(file_object.read)

#file_object.read(-1)

#file_object.read(count) #读取指定数量的内容, i

try:

with open(file_name,encoding='utf-8') as file_object :

file_count=''

chunk = 100

while True:

content = file_object.read(chunk ) #读取所有内容

print(content,end='' )

if not content :

break

file_count +=content

except FileNotFoundError:

代码块(处理方式)

 

# readline() 读一行

# readlines() 以列表形式保存

try:

with open(file_name,encoding='utf-8') as file_object :

for file_count in file_object :

print(file_count )

file_count +=file_count

except FileNotFoundError:

代码块(处理方式)

 

@2 写 write()

with open(file_name,mode='w',encoding='utf-8') as file_object :

# open(file_name,'w',encoding='utf-8')

#指定操作类型w

#write文本型直接write(str)

file_object.write('hello')

file_object.write('hello\n')

r=file_object.write(str(123)) #可以分段写入,只能写入字符串,每次写入会返回写入的长度

 

#旧文件

file_name=''

with open(file_name,mode='rb') as file_object :

#二进制不要encoding

#新文件

new_name = '';

with open(file_name,mode='wb') as new_object :

#每次读取大小

chunk = 1024*100

while True :

#从旧文件读取

content = file_object.read(chunk)

#内容读取完毕终止

if not content :

break

#将读取到的写入新文件

new_object.write(content )

 

@3 读取位置

tell()查看当前读取位置

seek() 修改当前读取位置

#seek()需要两个参数,1要切换的位置;2计算位置方式(0,1,2)

#0表示从头计算(默认值);1表示从当前已读位置计算;2表示从最后位置接着读,用-1倒数

with open(file_name,mode='rb') as file_object :

print(file_object.read(100),end='' )

print('当前读取到了',file_object.tell())

file_object.seek(55,0)

 

3.保存

4.关闭

file_object.close()

 

#with ... as 语句

with open(file_name) as file_object :

#file_object 存活时间只是在with 。。。 as 的代码块中,等于自动关闭

print(file_object .read())

 

#

try:

with open(file_name) as file_object :

print(file_object .read())

except FileNotFoundError:

代码块(处理方式)

else:

代码块(没错误时执行代码,错误不执行)

 

文件的其他操作

os


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论