python基础速过

一、变量命名: 不能以数字开头,由字母、数字、下划线组成。不能起关键字、保留字、内置函数。
dir(__builtins__)  # 内置函数

import keyword   #关键字
print(keyword.kwlist)
 二、变量类型
type() #查看变量类型

整数型int、 浮点型float、布尔型bool、复数complex

三、 单引号、双引号、三引号

单引号、双引号不支持换行,三引号支持换行(一般用来多行注释)

四、字符串的拼接
# 使用 + 拼接
'2024' + '年' + '10' + '月' + '20' + '日'

# %s
'%s年%s月%s日'%(str1,str2,str3)

# join
'-'.join([str1,str2,str3])

# format
'{}年{}月{}日'.format(str1,str2,str3)
'{1}年{2}月{0}日'.format(str1,str2,str3)

# f''
f'{str1}年{str2}月{str3}日'
五、常见的数值模块
import decimal  #导入,高精度模块必须用字符串导入
decimal.Decimal('2.2') - decimal.Decimal('2')

import math #导入数学模块
math.pow(2,3) #x的y次方
math.sqrt(9)  #开平方
math.fabs(-1) #绝对值
math.pi    #圆周率
 六、条件语句
#非逻辑  not  取反

#三者之间的优先级  not>and>or

#逻辑短路  and  or

# 三目运算
print('大于5' if a>5 else '不大于5')

#for循环  计数循环
#'python'可迭代对象
for i in 'python':
    print(i)

#range()内置函数
#当range函数里面只写一个参数时,默认从0开始
#当range函数里面写了两个参数时,[开始  结束)  左闭右开
#当range函数里面写了三个参数时,开始  结束  步长
for i in range(5,11,3):
    print(i)
七、列表
#1.索引值从0开始  索引取值超过索引长度会报错
#2.负索引从列表的尾部开始往前取,负索引从-1开始

#3.切片 遵循左闭右开
# 从左往右切割,步数为正数
# 从右往左切割,步数为负数
li = [1,2,3,5,4,2]
li[2:5:3]


#4.增删改查
#查  根据元素查找元素的索引值
index()

#增   追加   加在最后
append() 

#指定位置插入元素
insert(下标,元素)

#批量添加  添加时要加[ ]
extend()
 
pop()  #默认删除最后一个元素  加下标删除对应元素
remove()   #根据元素名称删除元素
del     #批量删除
clear()   #清空所有元素

#改    直接赋值语句进行修改


#5.其他方法
copy()  #复制
sort() #排序   同类型才能排序 
reverse()  #反向   
sort(reverse=True)  #反向排序
sorted()   # 临时排序
sorted(li,reverse=True)   # 临时反向排序
count()   #计数
八、元组(tuple)

是不可变序列,用小括号定义元组,一旦生成就不可增删改。

可切片、index()查、count()计数、拆包

#初始化一个元组
tuple = ()

#元组里面保存一个数的两种写法
tuple = 2,
tuple = (2,)

#拆包
tuple=(1,2,3,4,5,6)
a,b,*c=tuple
#单个打印的: print(c) 这里不带星号
print(a,b,*c)

#装包:就是讲多个值进行组合,打包为一个容器类型的过程
a=1
b=2
c=3,4,5,6
print(a,b,c)
九、字符串
replace()  #替换
str1.replace('l','c',1)  # 数字代表替换的个数  只能从前往后替换
upper()  #大写
lower()  # 小写
capitalize()   #首字母大写
title()   #标题形式   每一个单词的首字母都会大写
strip()  #去掉字符串两边的空格

#切割   
split()  #默认以空格进行切割  默认不限制次数 -1
    #添加参数   指定切割符
    #还能添加数字   表示限定次数

#拼接  
join()


#查找   
index()  #默认找到第一个元素的位置
             #后面也可以指定元素开始查找的位置
             #如果找不到元素,就会报错
find()  #  如果找不到元素,就会返回-1


#其他方法
isalpha()  #判断是否全是字母
isdigit()  #判断是否全是数字
islower()  #判断是否全是小写
isupper()  #判断是否全是大写


#字符串的转义
# \n   换行*
# \t   水平制表符   实现对齐*
# \b   往前退一格   相当于退格键
# \a   系统提示音
# \0   产生一个空格
# \    取消字符串的转义
# r    统一取消字符串的转义*


#编码和解码  什么形式编码就要以什么形式解码,不然就会出现乱码
encode('utf-8') # 编码
decode()  #解码  默认解码格式就是utf-8
十、字典

无顺序,无法索引取值,只能通过键名一一对应。

#定义字典的方式
dic = {}
dic = {'x':1,'y':2,'z':3}   #常规的定义方式
dic = dict(a=1,b=2,c=3)  #利用dict函数
#增删改查
#查   根据键名取值  如果键不存在则会报错
get() #查找键对应的值  如果不存在则返回None

#增   setdefault(键名,键值)    "无则增,有则查"

#改   根据键修改值   赋值语句
      #update()   "无则增,有则改"
dic.update({'d':9,'x':'ww'})

#keys()得到所有的键
#values()得到所有的值
#items()得到所有的项(键值对)


#删  pop(键名) 根据键名删除数据
     #popitem()   只在3.6之后按添加进去的顺序删除
     #clear()   一键清空
十一、集合 set 散列
#定义集合{}   集合里面的数据都是单一的,没有重复
#集合里面的值具有唯一性,会自动去重,并且也是无序的
#不能索引取值

#交集 &   两个集合里面相同的元素   空集合set()
#并集 |   两个集合的元素合并在一起
#差集 -   前面的集合减去后面的集合中相同的元素


isdisjoint() #判断两个集合是否没有交集
issubset() #判断前面的集合是否被包含于后面的集合
issuperset() #判断前面的集合是否包含后面的集合
十二、身份运算符

is 判断两者之间内存地址是否一致

python当中存在内存池  范围在[-5,256]

范围内的内存地址一致,范围外的内存地址不一致

is not  取反
 

十三、成员运算符

in 判断元素是否属于对象里面的成员
not in  取反
不管是序列类型还是散列类型都可以用成员运算符
数值类型不行,也数值类型本身就是一个值

 

十四、  is not 和!=区别 , is和== 的区别

 is  判断地址是否相等,两个变量是否指向同一内存地址
==  判断两个变量的值是否相等

>>> a = 300
>>> b = 300
>>> a is not b
True
>>> a != b
False
# is、 is not
#python当中存在内存池  范围在[-5,256],范围内的内存地址一致,范围外的内存地址不一致

 

十五、函数(驼峰命名法)
#return 返回值
#return后面的语句不会执行
#把返回的值通过一个变量去接收
#无返回值,则返回None


#函数参数(必备参数,默认参数,不定长参数)
#必备参数一定要传入值



#在这个函数里面有两个参数,一个是x,一个是y
#x,y叫做必备参数
#y=100中y叫做默认参数
#args,kwargs不是规定写法,但是这是规范写法
#args是不定长参数,数据放在元组里面
#kwargs是不定长参数,数据放在字典里面,dict()函数
def func(x,y=100,*args,**kwargs):
    print(x)
    print(y)
    print(args)
    print(kwargs)
**********************
>>> func(1)
1
100
()
{}
**********************
>>> func(1,1000,20,4,1,3,a=1,b=3,c=9)
1
1000
(20, 4, 1, 3)
{'a': 1, 'b': 3, 'c': 9}
************************
>>> func(1,1000000,1000,100000,100000000,1000000,100000)
1
1000000
(1000, 100000, 100000000, 1000000, 100000)
{}
  • 函数作用域
#在函数外部定义的变量,全局变量
#在函数内部定义的变量,局部变量
#函数不会改变传入的不可变对象的值

#结果报错:赋值前引用了局部变量x
x = 100
def func():
    x = x + 1
    print(x)
  • 声明全局变量
x = 100
def func():
    global x
    x = 200
    print(x)

print(x)
func()
print(x)
#运行:100 200 200
  • 声明局部变量
#内层函数不能修改外层函数变量的值
#两个变量都是局部变量
#nonlocal声明局部变量,告诉系统你要对外层函数的变量作修改
def func():
    x = 100
    def func1():
        nonlocal x
        x = x + 1
        print(x)
    return func1()
  • 闭包
#内层函数使用外层函数中的变量
#外层函数的返回值是内层函数的函数体
def func():
    lv = 5
    #增加血量
    def func1():
        nonlocal lv
        lv += 1
        print(lv)
    #减少血量
    def func2():
        nonlocal lv
        lv -= 1
        print(lv)
    return func1,func2
#闭包案例2
# 定义内部函数:
def outer(num):
    # 2.定义内部函数,在内部函数中使用外部函数的变量
    def inner(num1):
        print(num + num1)
 
    # 3.外部函数返回内部函数的地址
    return inner  # 函数名字就是函数地址
 
 
if __name__ == '__main__':
    # 创建闭包实例
    func = outer(100)  # 此时func相当于是inner
    # 调用闭包
    func(10)  # 此时调用inner函数,保存的num值为100
# 可以创建多个闭包实例,不同的闭包实例之间,不会相互影响
 十六、文件
  • 文件的基本操作

        open函数打开文件
        默认以只读(r)打开,只能打开已经存在的文件
         w 只写形式打开,如果文件不存在,则会创建文件
        相对路径:从当前文件出发
        ./代表同级目录    ../代表上一级目录
        绝对路径:从磁盘位置出发
        open(r'C:\Users\Desktop\test.py','w')

  • 文件的写入
##以只写形式打开文件,每次打开文件都会清空文件之前的内容
##  a 追加形式打开文件,不会覆盖文件之前的内容
##f代表txt文件
f = open('test.txt','a')
f.write('\nhello world!')   #写入单个内容
f.writelines(['\nthis','\nis','\npython'])   #写入多个内容
f.flush()   #flush刷新,保存数据
f.close()  #关闭文件,自动保存
  • 文件的读取
f = open('test.txt','r')
#read()  不写值的情况下,读取文件的全部内容
#在写值的情况下,读取一定长度的内容
##print(f.read(10))
print(f.readlines())
f.close()
  • 文件可读可写
#r+  会替换原先的数据
#a+  不会替换原先的数据,以追加的方式加入内容
f= open('test.txt','a+')
f.write('\nhello world4')
f.write('\nhello world5')
f.write('\nhello world6')
print(f.tell())   #查看当前文件指针的位置
f.seek(0)   #把文件指针移到文件开头
print(f.read())
f.close()
  • 二进制
f = open('test.txt','ab+')  #追加写入二进制文件
f.write(b'\nhello world7')
f.seek(0)
print(f.read())
f.close()
  • 自动关闭文件 with open上下文管理器
#as是把打开的文件取名为f
with open('test.txt','a+') as f:
    f.seek(0)
    print(f.read())
  • 文件流 临时假文件

读文件:.read() 和 .getvalue()区别

import io
#生成字符串临时假文件
str_io = io.StringIO()
str_io.write('my name is anyan')
##str_io.seek(0)
##print(str_io.read())
#getvalue()方法获取文件内容,并且不需要重新定义光标的位置
print(str_io.getvalue())
str_io.close()

#二进制临时假文件
b_io = io.BytesIO()
b_io.write(b'hello world')
print(b_io.getvalue())
b_io.close()
  • 和操作系统交互的os模块
import os
os.getcwd() #获取当前文件的路径
os.chdir()#切换路径
os.listdir() #查看路径下的文件和子目录


os.mkdir('abc')  # 创建文件夹
os.rmdir('abc')   #删除文件夹
os.makedirs(r'aaa\bbb\ccc')  # 创建多层目录
os.removedirs(r'aaa\bbb\ccc')  #删除多层目录
os.system('cmd')  #打开cmd
os.system('python')  #打开cmd,并执行python的命令
os.walk()   #遍历文件夹
os.remove()  #移除文件
os.rename()   #文件重命名
os.path()   #对于文件路径的操作  可以和join实现路径的拼接
十七、模块导入

#模块导入   在Python里面,模块指的就是一个py文件
#在导入模式时,会先把模块里面的内容全部执行一遍

import datetime   #全部导入

from datetime import datetime   #部分导入

from datetime import datetime as dt  #通过as取别名
十八、类
#name  age   变量->类的属性
# eat        函数->类的方法
class Person:

    #__init__初始化方法,在实例化时会自动调用
    #self代表实例本身
    def __init__(self,name,age,sex):
        self.name = name
        self.age = age
        self.sex = sex

    def eat(self):
        print(f'{self.name}吃饭')

    #析构函数,当删除实例s时,就会调用此方法
    #通过del关键字来删除对象
    # del dou5
    def __del__(self):
        print(f'{self.name}被析构了')
        
dou5 = Person('xiaobai',18,'男')
十九、继承
class Person:
    name = 'xiaobai'
    age = 18
    sex = '男'

    def __init__(self,name,age,sex):
        self.name = name
        self.age = age
        self.sex = sex
    
    def __del__(self):
        print(f'{self.name}被析构了')
        
    def eat(self):
        print(f'{self.name}吃饭')

#创建的四川类,继承了Person类
#继承Person类也就是拥有这个类里面的属性和方法
#Person是SiChuan和GuangDong这两个类的父类

#eat()方法是重用   重新去定义父类的方法
class SiChuan(Person):
    def eat(self):
        Person.eat(self) #方法一
        print('四川人爱吃麻辣烫')
    
    def play(self):
        print('四川人爱打麻将')
    
class GuangDong(Person):
    def eat(self):
        #super代表使用父类的方法,推荐使用
        super().eat()

        print('广东人爱吃肠粉')
    
    def play(self):
        print('广东人爱喝茶')

*****************************************************
>>> dou5 = SiChuan('heihei',12,'nan')
>>> dou5.play()
四川人爱打麻将
>>> dou5.eat()
heihei吃饭
四川人爱吃麻辣烫
>>> dou6 = GuangDong('bb',3,'girl')
>>> dou6.play()
广东人爱喝茶
>>> dou6.eat()
bb吃饭
广东人爱吃肠粉
>>> del dou6
bb被析构了
>>> del dou5
heihei被析构了
二十、多继承 就近继承
class Person:
    name = 'xiaobai'
    age = 18
    sex = '男'

    def __init__(self,name,age,sex):
        self.name = name
        self.age = age
        self.sex = sex
    
    def __del__(self):
        print(f'{self.name}被析构了')
        
    def eat(self):
        print(f'{self.name}吃饭')

class SiChuan(Person):
    def eat(self):
        Person.eat(self) #方法一
        print('四川人爱吃麻辣烫')
    
    def play(self):
        print('四川人爱打麻将')
    
class GuangDong(Person):
    def eat(self):
        #super代表使用父类的方法,推荐使用
        super().eat()
        print('广东人爱吃肠粉')
    
    def play(self):
        print('广东人爱喝茶')

class HunXue(SiChuan,GuangDong):
    pass

hunxue = HunXue('混血',1,'女')

#HunXue.__base__  查看继承的第一个类
#HunXue.__bases__   查看类继承的所有类
#HunXue.mro()  查看继承顺序
#多继承案例2

class base:
    def eat(self):
        print('base')


class A(base):
    def eat(self):
        super().eat()
        print('A')


class B(base):
    def eat(self):
        super().eat()
        print('B')


class C(A,B):
    def eat(self):
        super().eat()
        print('C')
if '__main__':
    cc = C()
    cc.eat()
二十一、面向对象高级 常用的内置函数
#hasattr(anyan,'name')  判断实例对象有没有属性
#getattr(anyan,'name')  获取实例对象对应的属性值
#setattr(anyan,'sex','女')  设置实例对象的属性及属性值  ‘无则增,有则改’
#delattr(anyan,'sex')  删除是实例对象的属性
#issubclass()  判断前面的类是不是后面类的子类
#isinstance()  判断前面的实例是不是后面的实例或者判断类型

class Person:
    def __init__(self,name,age):
        self.name = name
        self.age = age

ddd = Person('低保',18)


class Hunan(Person):
    pass
a = getattr(ddd,'name') if hasattr(ddd,'name') else setattr(ddd,'name','低保')
二十二、属性调用过程
class Person:
    def __init__(self,name,age):
        self.name = name
        self.age = age

    #重写  引用没有定义的属性不会报错
    def __getattr__(self,item):
        print(f'{item}属性不存在')

ddd = Person('低保',18)
二十三、魔法方法  http://t.csdnimg.cn/uE31x
  1. 让类创建的对象在系统中只有唯一的一个实例
  2. 每一次执行 类名() 返回的对象,内存地址是相同的

 

1)使用类名()创建对象时,Python解释器做的2件事:
  1. 使用 类名() 创建对象时,Python解释器首先会调用__new__方法为对象分配空间
  2. Python的解释器获得对象的引用后,将引用作为第一个参数,传递给__init__方法

 

2)重写__new__方法的代码非常固定:
  1. 重写__new__方法一定要返回分配了空间return super().__new__(cls)
  2. 否则Python的解释器得不到分配了空间的对象引用,就不会调用对象的初始化方法

 3) 让初始化只执行一次

class MusicPlayer(object):
    # 记录第一个被创建对象的引用
    instance = None
    # 记录是否执行初始化动作
    init_flag = False
 
    def __new__(cls, *args, **kwargs):
 
        # 1. 判断类属性是否是一个空对象,没有是空对象,说明第一个对象还没被创建
        if cls.instance is None:
            # 2. 调用父类的方法,为第一个对象分配空间
            cls.instance = super().__new__(cls)
 
        # 3. 返回类属性保存的对象引用
        return cls.instance
 
    def __init__(self):
 
        # 1. 判断是否执行过初始化动作
        if MusicPlayer.init_flag:
            return
        # 2. 如果没有被执行过,再执行初始化动作
        print("初始化方法执行")
 
        # 3. 修改类属性init_flag的值为True
        MusicPlayer.init_flag = True
 
 
# 创建多个对象,对比地址是否相同
player1 = MusicPlayer()
print(player1)
 
player2 = MusicPlayer()
print(player2)

 

二十四、序列协议
class IndexTuple:
    #*args接收传进来的值
    def __init__(self,*args):
       self.values = tuple([i for i in args])
       self.index = tuple(enumerate(self.values))


    def __len__(self):
        return len(self.values)

    #key代表索引
    def __getitem__(self,key):
        return self.index[key][1]
        
    def __repr__(self):
        return str(self.values)

  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值