'''
函数:
    函数参数:必备参数、默认参数、不定长参数(元组不定长 字典不定长)
    函数的定义不会被执行
    函数的调用才会被执行
'''
# n1 = "name",10,20,{"name":"bd","id":2},{"age":18}
# zd = {"name":"bd","id":2}
# def fun(x,y=10,*args,**kwargs):
#     print(x,end=" ")
#     print(y,end=" ")
#     print(args,end=" ")
#     print(kwargs,end=" ")
# # fun(n1)       # name 10 (20, {'name': 'bd', 'id': 2}, {'age': 18}) {}
# # fun("name",10,20,{"name":"bd","id":2},age=18)       # name 10 (20, {'name': 'bd', 'id': 2}, {'age': 18}) {} name 10 (20, {'name': 'bd', 'id': 2}) {'age': 18}
# # fun("name",10,20,zd,age=18)       # name 10 (20, {'name': 'bd', 'id': 2}) {'age': 18}
#
# # 想将字典里的可以通过字典拆包的形式,这里是指**zd,进行参数传递
# fun("name",10,20,**zd,age=18)       # name 10 (20,) {'name': 'bd', 'id': 2, 'age': 18}

‘’’
闭包,外层函数,返回内层函数的函数体
函数里面没有return,函数就没有返回值,变量接收返回None
‘’’

# def funa():
#     def fune():
#         print(123)
#     return fune
# a = funa()
# print(a)    # <function funa.<locals>.fune at 0x000002DD4C9F09D8>
# a()     # 123
'''
global:
    不可变数据需要声明,如字符串、数值、元组等;
    可变数据不需要声明,如列表、字典、集合。
nonlocal:
    函数嵌套函数时,要使用外层函数变量时,需要声明
'''
# a = 12
# def fun():
#     global a
#     a += 1
#     b = a
#     def fune():
#         global a
#         a += 1
#         nonlocal b
#         print(a,b)
#     return fune
# c = fun()
# c()     # 14 13

‘’‘函数递归’’’

# def fun(x):
#     if x == 1:
#         return 1
#     else:
#         return x*fun(x-1)
# a = fun(3)
# print(a)        # 6

‘’‘匿名函数:lambda’’’

# def f(x):
#     return x
#
# # or
# f = lambda x:x
#
# print(f(2))       # 2
# print(list(map(lambda x:x*10,(1,2,3))))     # [10, 20, 30]
'''
变量存储数据,永久保存 文件,
open()  有返回值    返回文件本身
    里面有三个参数:
        文件路径:
            绝对路径:(从磁盘出发)
                【如】r'F:\03、Python技能提升'
                最好加上r,防止字符串转义
            相对路径:(从程序自身出发)
                上一级路径   ../
                同层级     ./或者不写
                下一级路径   /
                【注】程序和打开的文件在同一个最小文件夹里属于同层级,程序在的(即文件夹中箭头往左、往上)为上一级
                【如】r'../基础语法/10、阶段小结(2)'
        默认方式:
            r:只读模式
            w:先清空后写入,文件不存在则创建文件
            a:追加模式,文件不存在则创建文件
            +:更新模式,结合rwa模式
            b:二进制打开模式
                字符文件:txt,右键通过记事本打开能看懂的
                字节文件:png、音频,二进制文件   
        编码格式
read()  从哪里读取内容     如下f.read()
tell()  查看光标
seek()  调整光标
'''
# # 只读模式r
# f = open('汉字.txt','r',encoding='UTF8')      # 文件保存格式为UTF8,所以需要encoding='UTF8'声明编码格式为UTF8,使编码格式一致
# print(f)    # <_io.TextIOWrapper name='汉字.txt' mode='r' encoding='UTF8'>
# print(f.read())     # 沉迷代码,渐感兴奋


# # 写入模式w
# d = open('写入与追加操作.txt','w',encoding='UTF8')    # 先清空后写入,文件不存在则创建文件
# # 将内容写入文件,若有内容,则先清空后写入
# d.write('NIHAO')
# # 保存文件
# d.flush()


# 追加模式a
# d = open('./写入与追加操作.txt','a',encoding='UTF8')
# d.write(',Hello')
# d.flush()


# # 更新模式+
# e = open('更新模式.txt','w+',encoding='UTF8')
# e.write('NIHAO')
# e.flush()
# print(e.tell())     # 5
# e.seek(0)       # 调整光标
# print(e.read())     # NIHAO


# e = open('更新模式.txt','bw+')
# # e.write('NIHAO')    # 报错TypeError: a bytes-like object is required, not 'str'
# e.write(b'NIHAO')   # b'NIHAO',b表示二进制
# e.flush()       # 保存文件
# print(e.tell())     # 5
# e.seek(0)       # 调整光标
# print(e.read())     # b'NIHAO'
'''
文件的写入:
    write()     单行写入
    writelines()    多行写入
文件的读取:
    read()  读取全部,以字符串的形式返回
    readline()      读取单条
    readlines()     读取多条,以列表的形式返回,一行是一个元素
'''
# f = open('test.txt','a+',encoding='UTF8')
# f.writelines(['NIHAO\n','This Is Python\t','cool'])
# # 关闭,保存
# f.seek(0)
# print(f.readlines())
# f.close()
'''
with:上下文函数
执行完函数里面的代码,会自动关闭文件
f.closed:检测文件是否关闭
'''
# with open('test.txt','a+',encoding='utf8') as f:   # 即f = open()
#     f.seek(0)
#     print(f.read())
# print(f.closed)     # 可以检测文件是否关闭,若关闭则返回True
'''
IO文件流:创建在内存中的临时假文件 字符串  无编码格式限制
'''
# import io       # 用来创建临时假文件
# string = io.StringIO()    # 创建临时假文件
# string.write('123132')
# string.seek(0)
# print(string.read())
'''
IO:字节流:创建在内存中的临时假文件,字节数据
'''
# import io       # 用来创建临时假文件
# bys = io.BytesIO()  # 用来创建临时的二进制假文件
# bys.write(b'123132')
# bys.seek(0)
#
# print(bys.read())
# # or
# print(bys.getvalue())       # 读取二进制文件的方法getvalue()
'''
os 模块:
    mkdir(目录名)      创建文件夹
    rmdir(目录名)      删除文件夹
    makedirs(目录\目录\目录)      创建多层文件夹
    removedirs(目录\目录\目录)     删除多层文件夹
    rename(文件名,新文件名)    更改文件名
    system()    调用系统命令
    listdir()   查看目录下面存在的文件,以列表形式返回
    getcwd()    返回当前文件路径
    remove()    删除文件
    path.join()     拼接路径
    【注】文件路径与上方的文件操作路径标准一致
'''
# import os
# os.mkdir("bd")      #创建文件夹bd
# os.rmdir("bd")      #删除文件夹bd
# os.makedirs(r'bd\chenhong')     # 创建多层文件夹bd\chenhong
# os.removedirs(r'bd\chenhong')       # 删除多层文件夹bd\chenhong

# os.mkdir(r'bd')
# os.rename(r'bd',r'ch')      # 更改文件夹名

# print(os.listdir(path='./'))    # 默认有path='./'
# print(os.getcwd())      # 打印文件路径

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

# print(os.path.join('123','456'))      # 拼接路径,123\456
'''
模块和包:
    一个模块就是一个py文件
        import 模块
    包就是放了很多模块(py文件)的文件夹
        from 包 import 模块
库:
    同类型的py文件
'''
'''datetime模块'''
# import datetime
# print(datetime.datetime.now())      # 第一个datetime是包,第二个是模块,打印本地时间
#
# from datetime import datetime
# print(datetime.now())
if __name__=="__main__":        # 自己本身运行,执行
    print("我没有被当做模块调用")
else:       # 被当做模块调用,执行
    print("怎么还没有走,我好着急")

文章到这里就结束了!