Python基础知识3

函数

先定义后调用
定义函数:
    def 函数名(参数):
        代码块

函数的说明文档--help(函数名):
    def sum(a,b):
        """求和函数"""
        return a+b
    help(sum)
    结果显示:
        sum(a, b)
            求和函数

    高级使用:
        def sum(a,b):
            """(点击回车)
            求和函数
            :param a:参数1
            :param b: 参数2
            :return: 返回值
            """
            return a+b
        help(sum)
        结果显示:
            sum(a, b)
                (点击回车)
                求和函数
                :param a:参数1
                :param b: 参数2
                :return: 返回值
局部变量的作用:在函数体内部,临时保存数据,即当函数调用完成后,就立即销毁
全局变量:在函数体内外都能用的变量
关键字global:
    global a    #声明a为全局变量
返回值:return 后面可以写多个函数值、元组、列表、字典
    def method(a,b):
        return a,b
    num_1,num_2=method(1,2)
参数:
    位置参数:调用参数时根据函数定义的参数位置来传递参数,传递和定义参数的顺序及个数必须一致

    关键字参数:通过“键=值”形式加以指定。可以让函数更加星系、容易使用,同时也清除了参数的顺序需求
        def user(name,age,gender):
            print(f'您的名字是{name},年龄是{age},性别是{gender}')
        user('Rose',age=20,gender='女')      *您的名字是Rose,年龄是20,性别是女*
        user('Tom',gender='男',age=18)     *您的名字是Tom,年龄是18,性别是男*
        user(gender='男',age=18,'Tom')     *报错*
        #位置参数必须写在关键字参数前面,,关键字参数之间不存在顺序

    缺省参数(默认参数):             所有位置参数必须出现在默认参数前面
        def user(name,age,gender='男'):
            print(f'您的名字是{name},年龄是{age},性别是{gender}')
        user('Rose',20,'女')      *您的名字是Rose,年龄是20,性别是女*
        user('Tom',18)              *您的名字是Tom,年龄是18,性别是男*
        #函数调用时,如果为缺省参数传值则修改默认参数值,否则使用默认参数

    不定长参数(可变参数):
        用于不确定调用的时候会传递多少个参数(不传参也可以)的场景。
        此时,可以用包裹(packing)位置参数,或者包裹关键字参数,来进行参数传递
        无论是包裹位置传递还是包裹关键字传递,都是一个组包的过程
        包裹位置传递:
            def user(*args):
                print(args)
            user('Tom')         *('Tom',)*
            user('Tom',18)      *('Tom', 18)*
            # 传进的所有参数都会被args变量收集,它会根据传进参数的位置合并为一个元组,args是元组类型
        包裹关键字传递:
            def user(**kwargs):
                print(kwargs)
            user(name='Tom')             *{'name': 'Tom'}*
            user(name='Tom',age=18)      *{'name': 'Tom', 'age': 18}*
            # 合并为一个字典
拆包:
    元组:
        def method():
            return 100,200
        result=method()      #result为元组类型
        num1,num2=method()      #拆包,注意个数问题
    字典:
        dict = {'name':'Tom','age':20}
        a,b = dict
        #对字典拆包,取出来的是字典的key
        print(a)            *name*
        print(b)            *age*
        print(dict[a])      *Tom*
        print(dict[b])      *18*
交换变量:
    方法一:利用第三变量存储数据
    方法二:
        a = 1
        b = 2
        a,b = b,a
引用:
    id():检测变量的id值(内存的十进制值)
    a = 1
    b = a
    print(b)        *1*
    print(id(a))    *1420648672*
    print(id(b))    *1420648672*
    a = 2           *1*     #因为修改了a的数据,所以要开辟另一份内存空间存储2,id检测到a与b的内存地址不同
    print(id(a))    *1420648704*
    print(id(b))    *1420648672*
    print(b)
    # int型数据是不可变类型,列表是可变

可变类型:列表、字典、集合
不可变类型:整数、浮点型、字符串、元组
# 数据能够直接进行修改,那么就是可变,否则就是不可变

匿名函数(lambda):满足简单的函数场景,仅仅能封装有限的逻辑;lambda只能是单个表达式,不是一个代码块
    语法:
        lambda 参数列表:表达式
        sum=lambda a,b,c:a+b+c
        print(sum(1,2,3))
    与三元运算符:
        a,b=1,2
        c = a if a>b else b

        max = (lambda x,y:x if x>y else y)
        c = max(1,2)
递归函数:自己调用自己
    优点:逻辑简单,定义简单
    缺点:容易导致栈溢出,内存资源紧张,甚至内存泄漏
    递归案例:模拟实现树形结构的遍历
        import os  #引入文件操作模块
        def findFile(file_Path):
            listRs = os.listdir(file_Path)  #得到该路径下所有文件夹
            for fileItem in listRs:
                full_path = os.path.join(file_Path,fileItem)    #获取完整的文件路径
                #判断是文件还是文件夹
                if os.path.isdir(full_path):
                    findFile(full_path)
                else:
                    print(fileItem)
                    pass
                pass
            else:
                return
            pass
        findFile('D:\Google下载')

模块

python有很多内置函数,只会自动导入一些常用函数
把函数定义在单独的文件中,成为一个模块,文件名就是模块名
    import xxx      #默认从当前目录下去寻找模块,不能加后缀.py
    xxx.def()       #调用
    
    from xxx import *
    
    from xxx import def     #从xxx模块中导入def方法
    def()
    
    from xxx import def as def2     #从xxx模块中导入def方法并命名为def2;防止重名或者方法名特别长
    def2()
    
    import xxx as xxx1      #给模块名起别名
    xxx1.def()

类(面向对象)

类的私有属性:
    两个下划线开头,说明该属性为私有,不能在类的外部被使用或直接访问
    class student():
        __name='小明'                            # 私有属性
        def shangke(self):
            print(f'{self.__name}在上课')
        def __doHomework(self):                 # 私有方法
            print(f'{self.__name}在写作业')
构造方法:   在类实例化时会自动调用
    def __init__(self): 
self:
    代表类的实例,而非类,self 不是 python 关键字
cls:代表这个类
类的方法:
    在类的内部,使用 def 关键字来定义一个方法,
    与一般函数定义不同,类方法必须包含参数 self, 且为第一个参数
继承: 可以多继承
    class fu():
        父类代码
    class zi(fu):
        子类代码
    class zi(fu1,fu2,fu3):  注意圆括号中父类的顺序,若是父类中有相同的方法名,而在子类使用时未指定,python从左至右搜索 
                            即方法在子类中未找到时,从左到右查找父类中是否包含方法。
重载:
    可以对类的专有方法进行重载
覆盖:
    super():    调用父类(超类)的一个方法。
通过模块导入类:
    class fu:   (文件名为父)
        def __init__(self,name,age): 
            self.name=name
            self.age=age
        def pri(self):
            print('父类的方法')
    import 父
    from 父 import fu 
    class zi():
        def __init__(self,name,age): 
            self.fu=父.fu(name,age)       #书写格式,父类.属性或父类.方法

文件操作

import os                   #导包
print(os.getcwd())          #输出当前的工作目录
os.chdir("C:\\Windows")     #修改工作目录,由文件夹组成
文件操作:
    1、读取文件内容
    open(file, mode='r',    buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
        (文件名,文件打开模式, 设置缓冲,      编码方式,        报错级别,     区分换行符,   传入的file参数类型)
        文件打开模式:
            r: 以只读方式打开文件;文件的指针将会放在文件的开头,这是默认模式
            w: 打开一个文件只用于写入
               如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除
               如果该文件不存在,创建新文件
            a: 打开一个文件用于追加
               如果该文件已存在,文件指针将会放在文件的结尾,也就是说,新的内容将会被写入到已有内容之后,追加在新一行在前面加个'\n'
               如果该文件不存在,创建新文件进行写入
            a+:打开一个文件用于读写;
               如果该文件已存在,文件指针将会放在文件的结尾,文件打开时会是追加模式
               如果该文件不存在,创建新文件用于读写
        with open(r'文件.txt',  encoding='utf8') as file:     #以防文件乱码
            content = file.read()
            print(content)
            file.close()
        *姓名、年龄、性别、电话*
    按行读取
        with open(r'文件.txt',  encoding='utf8') as file:
            for line in file:
                print(line)
    读取所有行并返回列表  
        with open(r'文件.txt',  encoding='utf8') as file: 
            l = file.readlines()        # 读取所有行并返回列表 
        for line in l:
            print(line)
    从文件中读取单独的一行    str = file.readline() 
    2、修改文件内容        与mode有关
        先打开,后写入:
            with open('文件.txt','w',  encoding='utf8') as file:
                file.write('写入的数据')         # 会把之前文件里的内容覆盖掉,把之前的内容清空,添加新的内容
文件夹操作:
    1、创建文件夹,默认在当前文件夹路径下
        相对路径
        os.makedirs("文件名1/文件名2")     *E:\Pythonworkspace\文件名1\文件名2*
        绝对路径
        os.makedirs("E:\\Pythonworkspace\\文件名")
        os.makedirs("E:/Pythonworkspace/文件名")

异常

异常捕捉可以使用 try/except 语句
    异常处理:
        try:
            执行代码
        except:
            发生异常时执行的代码
        else:
            没有异常时执行的代码

raise 语句抛出一个指定的异常
    抛出异常:
        x = -1
        if x < 0:
            raise Exception(f'x 不能小于0。x 的值为: {x}')

自定义异常: 通过创建一个新的异常类来拥有自己的异常,异常类继承自Exception类,可以直接继承或间接继承

断言:assert 用于判断一个表达式,在表达式条件为 false 的时候触发异常
    断言可以在条件不满足程序运行的情况下直接返回错误,而不必等待程序运行后出现崩溃的情况
    assert 1==2
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值