Python基础语法

Python基础知识

一、下载安装

官网下载地址:https://www.python.org/downloads

下载后执行安装文件,按照默认安装顺序即可。然后在命令行中输入python,检查是否安装完成。如果出现以下内容,则证明安装成功。

二、编译器

支持python的编译器有很多,

我个人使用pycharm,其功能齐全,唯一的缺点的收费。

或者Visual Studio Code也是一个不错的选择.

三、基础知识

1、数据类型

数据类型包括:字符串(string)、整数类型(int)、浮点数(float)、布尔类型(boolean)[其中float('inf')代表正无穷,float('-inf')代表负无穷]。其关系如图:

2、条件判断

if语句可以通过判断条件是否成立来决定是否执行某个语句

if···else···

if···elif······else···

"""用法如下"""
weather = '天晴'
if weather == '下雨':
    print('在家学习')
elif weather == '阴天':
    print('去钓鱼')
elif weather == '暴风雨':
    print('保命')
else:  
    print('去逛街')
    
# 特殊的三目运算
a = 3
print(True) if a>5 else print(False)

3、循环语句

3.1 for循环

for 变量名 in 可遍历对象:
声明操作
else: # 循环结束才会去执行,可以省略!
声明操作

for i in range(10):
    print(i)
else:
    print("finished")

3.2 while循环

while 循环条件:

​ 声明操作

else: # 循环结束才会去执行,可以省略!

​ 声明操作

while i<= 5:
    print(i)
    i += 1
else:
    print('finished')
    
# 死循环 
while True:
    pass

# 99乘法表的制作
num1 = 1
while num1 <= 9:
    num2 = 1
    while num2 <= num1:
        print(f'{num1}*{num2}={num1 * num2:<2} ', end='')
        num2 += 1
    print('')
    num1 += 1

3.3 结束循环

continue:跳出当前循环

break:终止全部循环

4、运算符

4.1 逻辑运算符

名称 用法
or 有一个为真,则为真
and 有一个为假,则为假
not 否定作用

4.2 比较运算符

符号 用法
< 小于
> 大于
= 等于
<= 小于等于
>= 大于等于
!= 不等于

4.3 算术运算符

符号 用法
* 乘法
+ 加法
- 减法
/ 除法
// 整除运算
% 取余运算
** 幂运算

4.4 布尔运算符

类型 作用 范围
True 除False外都为真
False 空列表、空元组、空字典,空集合,0,空字符串等

四、类和函数

1、 函数

def 函数名(): # 函数的命名用驼峰命名法

​ 函数体

函数名() #函数的调用:直接函数名加括号就是在调用函数,函数在调用时会执行函数里面的函数体

def fun():  # 定义一个函数
    print("This a function")
    
    
fun()  # 调用函数

1.1 函数参数

形参:在函数体内用到的参数

必备参数:函数在调用是必须要传入的参数,给了几个参数就必须传几个参数值

关键字参数:指定参数名来传参数值

不定长参数(默认参数,可以不写):接受的参数值不定,传多少,这个不定长参数就接受多少
一个号是元组不定长参数*args,两个**是字典不定长参数**kwargs

函数的注释 -> 提示:在help函数查看时可以看到

def func(*args, **kwargs) -> "define function":
    print(args, 'and ', kwargs)

    
func(1, 2, 3, a=1, d=2, c=3)  # 其中,a=1是关键字参数,

1.2 函数的作用域

函数内部的变量不能被函数外面使用,除非通过return返回

num1 = 20  # 这是全局变量
def func2():
	global num1  # global 关键字声明全局变量
	num1 = num1+1   
	print(num1)
    
print(num1)

闭包里面的局部变量

def func():
    num2 = 30    # 这是局部变量
    def func1():
        nonlocal num2  # nonlocal 关键字声明局部变量
        num2 = num2+1
        print(num2)
        
    def func2():
        print(num2)

    return func1,func2  # 外层函数返回内层函数的函数体

a,b = func()  #a = func1  a()  func1()

1.3 特殊函数

递归函数:函数自身调用自己

def recursion(n):  
    if n <= 1:  # 递归结束的条件
        return 1  # 结束返回1
    else:
        return n * recursion(n-1)  # 一直调用自己 5*4*3*2*1
    
print(recursion(5))

匿名函数:用在那些只使用一次的场景中,程序中只需要调用一次某个简单逻辑。

def g(x):
    x = str(x)
    return x

print(g(2))

# 转换成匿名函数
g = lambda x:x+1  # x就是函数g要传入的参数值,冒号后面就是对传入的参数做的操作
g(4)  # 匿名函数调用和函数一样

匿名函数也可以用在列表中

list1 = [2,'3',1,'4',7,'9',5]
list1.sort()
list1.sort(key=lambda x:int(x),reverse=False)  
print(list1)

2、 类

2.1 初级面向对象

面向对象的基本概念:类、属性、方法

类:黑白黄三种人,人类
属性:自身存在的,名字、性别、身高、体重、肤色,静态属性
方法:人会走路、吃饭、玩,动态属性

name1 = '小'  # 变量

class Person:  # class 帕斯卡命名法 PersonList
    name = '子'  # 定义在类里面的变量称之为属性
    age = 18
    def play(self,name): # 定义在类里面的函数称之为方法,self指实例化对象本身 self=zilin
        print(f'{name}正在玩游戏')

    def search(self,name):
        print(f'{name}正在查资料')


zilin = Person()  # 实例化类,创建一个对象,实例化成一个具体的人
bd = Person()  # 创建第二个实例化对象bd
bd.name = '北斗' # 重新给bd这个人给予一个名字
2.1.2 初始化变量

初始化函数__init__ 对属性重新赋值,让每个人拥有自己独有的属性

class Student:

	def __init__ (self, name, age):  # self指实例化对象本身 ,实例化对象是自动调用一次
		self.name = name   # 等号后面的是实例化的属性
        self.age=age
            
     def play(self): # 定义在类里面的函数称之为方法,self指实例化对象本身 self=zilin
        print(f'{self.name}正在玩游戏')  #bd.name

    def search(self):
        print(f'{self.name}正在查资料') # bd.name

    def __del__(self):  # 析构函数__del__:让对象在删除时输出一句话,删除对象自动调用
        print(f'{self.name}被删除了')

        
stu = Student(bd, 18)  # 实例化对象时吗,就应该相对应的给初始化函数传参
stu.play()
stu.search()
del stu  # 删除stu这个实例化对象
2.1.3 类的继承
class Student:

	def __init__ (self, name, age):  # self指实例化对象本身 ,实例化对象是自动调用一次
		self.name = name   # 等号后面的是实例化的属性
        self.age=age
            
     def play(self): # 定义在类里面的函数称之为方法,self指实例化对象本身 self=zilin
        print(f'{self.name}正在玩游戏')  #bd.name

    def eat(self):
        print(f'{self.name}正在吃饭') # bd.name

    def __del__(self):  # 析构函数__del__:让对象在删除时输出一句话,删除对象自动调用
        print(f'{self.name}被删除了')
    
    
class StuYear(Student):  # 继承Student中的所有方法

    def __init__(self, name, age, year):
        super().__init__(name, age)  # 继承Student类的实例化对象
        self.year = year

    def study(self):
        print("name:", self.name, "age:", self.age, "year:", self.year)
        
    def eat(self):
        Student.eat(self) # 指定类去使用里面的方法
        super().eat()  # 让重写发的子类拥有父类的方法
        print(f'{self.name}爱吃辣')
        

stu = StuYear('li', 20, 20)
stu.study()
stu.play()
StuYear.eat(self=stu)
2.1.4 多继承

使用''类名.mro()"方法查看继承顺序

class A:
    pass

class B:
    pass

class C:
    pass

class D(A, B, C):  # 调用顺序为A, B, C
    pass

print(D.mro())  # 查看继承顺序

2.2 高级面向对象

2.2.1 魔法方法

魔法方法具体讲解:https://www.cnblogs.com/liuzhongkun/p/16807992.html

class Person:
    def __init__(self,name):
        self.name = name
        
    def eat(self):
        print(f'{self.name}在吃饭')


kun = Person('kun')

hasattr(kun,'name')  # 判断属性是否存在
getattr(kun,'name')  # 得到属性值,没有则报错
setattr(kun,'name','一')  # 设置属性值,有则改,无则加
delattr(kun,'name')  # 删除属性

issubclass(Person,object)  # issubclass 判断第一个类是不是后面类的子类
isinstance(zilin,Person)  # isinstance  判断实例是否是后面类的实例对象
isinstance(1,(str,int,float))  # 还可以用来判断数据类型
type(zilin) == Person  # 只能判断单个类实例化衍生

__new__方法:new魔法方法创建实例化对象,以及如何让init初始化方法拥有参数去使用

class Person:
    def __new__(obj,*args,**kwargs):  #object祖宗类,new方法才是帮我们创建实例化对象的一个方法
        print('new实例方法')
        return object.__new__(obj)   # Person.eat(self)
    
    def __init__(self,name):
        print('init自动调用')
        self.name = name
        
zilin = Person('kun')

单例模式 : 创建的所有的实例化对象都是同一个对象

class Person:
    def __new__(obj,*args,**kwargs):  # object祖宗类,new方法才是帮我们创建实例化对象的一个方法
        if not hasattr(obj,'_instance'):  # not取反返回True,判断祖宗类object里面有没有这个_instance
            #通过属性限制他去创建多个新的实例对象
            obj._instance = object.__new__(obj)  #object.__new__(obj) 生成一个新的实例化对象
        
        return obj._instance  #返回实例化对象
    
   def __init__(self,name):
        print('init自动调用')
        self.name = name
        

z = Person('z') # 立第一个实例化对象会在object类去创建一个_instance属性
b = Person('b') # 建第二个实例化对象判断属性存在返回第一个实例化对象
y = Person('y') # 第三个实例化对象判断属性存在还是返回第一个实例化对象

z==b==y  # 上创建的都是同一个实例对象

输出魔法方法 __str__ __repr__

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

        self.name = name
        self.age = age

    def __str__(self):  # 针对print输出魔法方法
        
        return f'这个是{self.name}的str魔法方法'

    def __repr__(self):  # 直接输出实例对象时会调用
        
        return f'这个是{self.name}的repr魔法方法'

z = Person('z',18)
z  # repr方法调用
print(z)  # str方法调用

__call__方法:让实例对象像函数一样去调用

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

        self.name = name
        self.age = age

    def __call__(self,x,y):
        return x+y
        

z = Person('z',18)
z(1, 2)
2.2.2 协议

序列协议

li = (1,2,3,4) 

class IndexTuple:
    def __init__(self,*args):  # args元组不定长参数拿到是一个元组
        self.values = args  
        self.index = tuple(enumerate(self.values))  # 通过枚举enumerate的方法将下标索引和自身的元素组成一个大大的元组
        print(self.index)
    def __len__(self):
        return len(self.values)

    def __getitem__(self,key):  # 通过下标索引key取值
        return self.index[key]
        return self.values[key]
    
    def __repr__(self):
        return str(self.values)  # 只能返回字符串

my_t = IndexTuple(1,2,3,34)

可迭代对象 --> 取值,像字符串,元组,列表,集合,字典能够被如循环取值一个一个拿取到元素的数据类型

li = [1,2,3,4,5]  # 可迭代对象
li1 = iter(li)  # 将可迭代对象转成一个迭代器对象,迭代器对象就是能够被next一个一个将值取出
next(li1)

迭代器协议

class Number:
    def __init__(self,end):
        self.start = 0
        self.end = end
    def __iter__(self):  #构建一个迭代器对象
        return self

    def __next__(self):  #对迭代器对象取值
        self.start += 1
        if self.start <= self.end:  #当self.start值小于self.end
            return self.start  #返回self.start
        else:
            raise StopIteration  #抛出终止迭代异常
                
nu = Number(6)

for i in nu:
    print(i)

# 也可以用next(nu)函数去调用

上下文协议: 计时器,所谓的秒表,检测代码运行时长

import time  #时间模块

class RunTime:
    def __enter__(self):  #接收代码开始时间
        self.star_time = time.time() #获得当前开始时间
        return self.star_time

    def __exit__(self,exc_type,exc_val,exc_tb):
        self.end_time = time.time() #获取当前结束时间
        self.run_time = self.end_time - self.star_time  #代码运行时间
        print('代码运行时间为:',self.run_time)


with RunTime():  #使用方法
    # 要执行的代码,运行时长
        pass
2.2.3 生成器和装饰器

生成器等同于迭代器 yield 关键字返回值 next获取值

生成器详解:https://www.cnblogs.com/liuzhongkun/p/16212744.html

def func():
    print(1)
    yield 2  # 和return一样有一个暂停函数的功能,并且遇到下一个next会继续向下执行
    print(3)
    yield 4
    print(5)
    yield 6

a = func()
for i in a:
    print(i)
# 或者使用next(a),通过next获取值得到返回值

装饰器:闭包加回调函数

装饰器具体讲解:https://blog.csdn.net/qq_62789540/article/details/124513178

def fun(x):
    def fun1(aa, bb):
        print(aa, 'and:', bb)
        return x(1, 2)

    print('外层函数')
    return fun1

@fun
def func(cc, dd):
    print('这是func的值:', cc, dd)
    
func(3, 4)

内置装饰器:

class Person:
    def __init__(self,name,age):
        self.name = name
        self.age = age
        
    @classmethod  # 第一个参数自动传入类
    def learn(cls):  # cls=Person
        print(f'{zl.name}在学习')
        print(cls)
        
    @staticmethod  #不在自动传入self
    def sleep():
        print(zl.name)
        print('在睡觉')


zl = Person('z',18)

Person.learn()
Person.sleep()

五、常用操作

1、 格式化操作

%方式

format方法

2、 常用函数

print():输出函数

input():输入函数

type():查看数据类型

id():查看内存地址

eval():去除双引号

3、 异常信息

try:
	pass
except Exception as e:  # 保错后键异常信息存储在e中
	pass   
finally:  # 无论报不报错都运行
	pass
异常名称 描述
BaseException 所有异常的基类
SystemExit 解释器请求退出
KeyboardInterrupt 用户中断执行(通常是输入^C)
GeneratorExit 生成器(generator)发生异常来通知退出
Exception 常规错误的基类
StopIteration 迭代器没有更多的值
StandardError 所有的内建标准异常的基类
ArithmeticError 所有数值计算错误的基类
FloatingPointError 浮点计算错误
OverflowError 数值运算超出最大限制
ZeroDivisionError 除(或取模)零 (所有数据类型)
AssertionError 断言语句失败
AttributeError 对象没有这个属性
EOFError 没有内建输入,到达EOF 标记
EnvironmentError 操作系统错误的基类
IOError 输入/输出操作失败
OSError 操作系统错误
WindowsError 系统调用失败
ImportError 导入模块/对象失败
LookupError 无效数据查询的基类
IndexError 序列中没有此索引(index)
KeyError 映射中没有这个键
MemoryError 内存溢出错误(对于Python 解释器不是致命的)
NameError 未声明/初始化对象 (没有属性)
UnboundLocalError 访问未初始化的本地变量
ReferenceError 弱引用(Weak reference)试图访问已经垃圾回收了的对象
RuntimeError 一般的运行时错误
NotImplementedError 尚未实现的方法
SyntaxError Python 语法错误
IndentationError 缩进错误
TabError Tab 和空格混用
SystemError 一般的解释器系统错误
TypeError 对类型无效的操作
ValueError 传入无效的参数
UnicodeError Unicode 相关的错误
UnicodeDecodeError Unicode 解码时的错误
UnicodeEncodeError Unicode 编码时错误
UnicodeTranslateError Unicode 转换时错误
Warning 警告的基类
DeprecationWarning 关于被弃用的特征的警告
FutureWarning 关于构造将来语义会有改变的警告
OverflowWarning 旧的关于自动提升为长整型(long)的警告
PendingDeprecationWarning 关于特性将会被废弃的警告
RuntimeWarning 可疑的运行时行为(runtime behavior)的警告
SyntaxWarning 可疑的语法的警告
UserWarning 用户代码生成的警告

六、文件管理

1、 文件读写

文件打开

相对路径:在py脚本文件同级目录下的文件 .\同级目录 ..\上级目录
绝对路径:完整的路径

文件读写mode

a追加模式下,如果文件不存在,也会自动帮我们创建一个文件,之后在写入内容
和w只写的区别就是一个是清空再写入,一个是继续向后写

文件操作

打开

file = open("FilePath", mode="type"(, encoding="")) # 要记得关闭文件

pass

file.close()

with open("FilePath", mode="type"(, encoding="")) # 上下文管理器打开,可以不用关闭

写入

file.writre("content") # write()方法:需要传入一个字符串做为参数,否则会报错

file.writelines() # writelines()方法:既可以传入字符串又可以传入一个字符序列,并将该字符序列写入文件

读取

file.read() # read()方法:一次性读如并返回文件的所有内容

file.readlines() # readlines()方法:每次读取一行;返回的是一个字符串对象,保持当前行的内存。一次性读取整个文件;自动将文件内容分析成一个行的列表 

遍历读取

  • 文件对象本身可以迭代,并且以行的形式读取

for i in file:
print(i)

指针

file.tell() # tell()方法:返回文件的当前位置,即文件指针当前位置。

file.seek() # seek()方法:用于移动文件读取指针到指定位置。

  • seek第一个参数:移动的长度(字节);如果该值为负数,表示从后往前移动n个字节
  • seek第二个参数:0从开头(默认),1从当前,2从末尾

2、 OS模块

方法含义
os.sep符合当前系统的路径分割符,Linux/windows\
os.name返回操作系统类型windows“nt”Linux“posix”
os.rename更改文件名,传递两个参数(旧文件名,新文件名)
os.getcwd返回当前的工作目录
os.listdir列出指定目录下的目录和文件
os.chdir修改当前的工作路径
os.mkdir创建目录
os.makedirs递归创建目录
os.remove删除文件
os.rmdir删除文件夹(文件夹下内容为空)
os.removedirs递归删除文件夹
os.system执行系统命令
os.popen执行系统命令,会将结果以文件的形式返回
os.walk通过在目录树中游走输出在目录中的文件名,向上或者向下
os.path.join连接目录和文件名。os.path.join(path,name)
os.path. isfile判断指定对象是否为文件。是返回True,否则False
os.path.isdir判断指定对象是否为目录。是True,否则False
os.path. split返回路径的目录和文件名
os.path. exists检验指定的对象是否存在。是True,否则False
os.path.getsize获取指定对象的文件大小
os.path.abspath获得绝对路径
os.path.basename返回文件名
os.path.dirname返回文件所在目录

3、 sys模块

方法 含义
sys.argv 获取命令行参数列表,第一个元素是程序本身
sys.exit(n) 退出Python程序,exit(0)表示正常退出。当参数非0时,会引发一个SystemExit异常,可以在程序中捕获该异常
sys.version 获取Python解释程器的版本信息
sys.maxsize 最大的Int值,64位平台是2**63 - 1
sys.path 返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值
sys.platform 返回操作系统平台名称
sys.stdin 输入相关
sys.stdout 输出相关
sys.stderr 错误相关
sys.exc_info() 返回异常信息三元元组
sys.getdefaultencoding() 获取系统当前编码,默认为utf-8
sys.setdefaultencoding() 设置系统的默认编码
sys.getfilesystemencoding() 获取文件系统使用编码方式,默认是utf-8
sys.modules 以字典的形式返回所有当前Python环境中已经导入的模块
sys.builtin_module_names 返回一个列表,包含所有已经编译到Python解释器里的模块的名字
sys.copyright 当前Python的版权信息
sys.flags 命令行标识状态信息列表。只读。
sys.getrefcount(object) 返回对象的引用数量
sys.getrecursionlimit() 返回Python最大递归深度,默认1000
sys.getsizeof(object[, default]) 返回对象的大小
sys.getswitchinterval() 返回线程切换时间间隔,默认0.005秒
sys.setswitchinterval(interval) 设置线程切换的时间间隔,单位秒
sys.getwindowsversion() 返回当前windwos系统的版本信息
sys.hash_info 返回Python默认的哈希方法的参数
sys.implementation 当前正在运行的Python解释器的具体实现,比如CPython
sys.thread_info 当前线程信息

七、模块和包

1、 模块

其是一个 Python 文件,以 .py 结尾,包含了 Python 对象定义和Python语句。

2、 导包

import 包名 # 导入模块

import 模块名 as 别名

from 模块名 import 成员名 as 别名

from 模块名 import 成员名

from 模块名 import * # 从模块中导入所有方法

同时,还可以使用__import__动态导入第三方库,其为一个魔法方法。

posted @ 2021-12-07 18:27  Kenny_LZK  阅读(411)  评论(0编辑  收藏  举报