文件处理,函数

文件打开的模式

#/usr/bin/env python
# Author:hongjie.gao

# r模式是默认的模式。只读,文件不存在则报错
# f=open('a.txt',encoding='utf-8')            # 默认以读的方式打开
# print(f.read())
# f.write('11111 ')          # 不可写
#  print('====>',f.read())       # 读所有,读出来bytes类型,open函数把bytes类型decode'utf-8'=====>str
#  print('====>',f.read())

# print(f.readlines())        #读所有,结果放入列表中

# print(f.readline(),end='')       # 一次读一行
# print(f.readline(),end='')

# f.close()


# W:只写模式,如果文件存在则清空,如果文件不存在则新建
# f=open('a.txt',mode='w',encoding='utf-8')
# f=open('b.txt',mode='w',encoding='utf-8')
# print(f.read())
# print(f.write('1111 '))   # 一定要自己加换行符
# print(f.write('2222 '))     #unicode----encode--->bytes
# print(f.write('3333 '))

# l=['44444 ','55555 ','66666 ']
# for line in l:
#     f.write(line)
# print(f.writelines(['44444 ','55555 ','66666 ','777777 ']))
#
# print(f.writable())     # 是不是可写
# f.close()

# a:追加写模式(日志):如果文件存在则把光标移动到文件末尾,如果文件不存在则新建
# f=open('c.txt','a',encoding='utf-8')
# f.write('3333333 ')
# f.writelines(['555555 ','666666 '])
# f.close()


# with open('a.txt',encoding='utf-8') as f:
#     # # lines=f.readlines()
#     # # for line in lines:
#     # #     print(line,end='')
#     #
#     # for line in f:
#     #     print(line,end='')

#
# with open('a.txt',mode='rt',encoding='utf-8') as f:
#     for line in f:
#         print(type(line),end='')

# with open('nb.png',mode='rt',encoding='utf-8') as f:
#     pass

# b:以bytes的形式去操作文件内容,不转码,不能指定编码
# with open('nb.png',mode='rb',encoding='utf-8') as f:  #不能带字符编码
#     f.read()

# with open('nb.png',mode='rb') as f:
#     print(f.read())

# with open('a.txt',mode='rb') as f:
#     data=f.read()
#     print(data.decode('utf-8'))

# with open('d.txt','wb') as f:
#     f.write('哈哈哈哈哈hello'.encode('utf-8'))
#
# with open('d.txt','ab') as f:
#     f.write('h哈哈哈哈哈hell '.encode('utf-8'))
#


# 了解部分:
# print(f.readable())     # 是不是可读的
# print(f.writable())

文件操作

#/usr/bin/env python
# Author:hongjie.gao
encoding='utf-8'

# 打开
f=open('a.txt',mode='r',encoding='utf-8')
# /
# data=f.read()
# print(data)
# 关闭
# print(f)
# del f   #回收python资源(自动回收)
# f.close()             #回收操作系统的资源


# 流程分析:
# 1.向操作系统发起系统调用
# 2.操作系统打开这个文件,返回一个文件句柄给应用程序
# 3.在应用程序中把文件句柄赋值给一个变量

# 注意两点
# 1.打开一个文件对应两部分,一个是python级别的文件句柄,另外一个是操作系统打开的文件(默认打开文件的编码是以操作系统的
# 编码为准,除非open()指定encoding='编码'
# 2.当文件操作完毕后,应该回收两部分资源
# del f  回收应用程序资源(python解释器自动的垃圾回收机制已经替我们做了)
# f.close  回收操作系统资源




# 上下文管理
with open('a.txt',mode='r',encoding='utf-8') as f:
    print(f.read())

补充---bool值

#/usr/bin/env python
# Author:hongjie.gao
# bool值,所有的 数据类型都自带布尔值
# 布尔值为假的情况:0,空,None

# 数字类型,当x=0时为假
#
# x=1
# print(bool(x))
#
# if x:
#     print('ok')

# 列表类型:当列表为空时为假(空字符串,空元组,空字典,空集合)
x=[]
print(bool(x))

为何要定义函数

#/usr/bin/env python
# Author:hongjie.gao

# 组织结构混乱,可读性差
# 代码冗余
# 无法统一管理,维护难度极大

# 具备某一功能的工具即函数

# 函数的使用必须遵循:先定义,后调用

# 函数分类:
# 1:内置函数:python解释器自带的函数,python解释器启动就会定义好这些函数
# len()
# max()
# min()
# sum()
 # 2:自定义函数
 # 语法:
 # def 函数名(参数1,参数2,...):
 #     """注释"""
 #     函数体
 #     return 返回值

#  实现以下功能
'''
==========
==========
hello word
==========
==========
'''
# 定义阶段
def tell_tag():
    print('==========')

def tell_msg(msg):
    print(msg)
#调用阶段
tell_tag()
tell_tag()
tell_msg('hello word')
tell_tag()
tell_tag()
定义函数的三种模式

#/usr/bin/env python
# Author:hongjie.gao
# # 定义无参函数
# def main():
#     while True:
#         user=input('>>:').strip()
#         # if len(user)==0:continue
#         if not user:continue
#         password=input('>>:')
#         res = auth(user,password)
#         if res:
#             print('login successful')
#         else:
#             print('login err')



# 定义有参函数:函数体的代码需要外部传入值

# def auth(user,pwd):
#     if user == 'egen' and pwd == '123':
#         return True
#     else:
#         return False
# main()



        # def   my_max(x,y):
#     if x > y:
#         return x
#     else:
#         return y
# res=my_max(1,3)
# print(res)
#


# 空函数

def foo(user,pwd):
    pass

函数定义阶段干了什么

#/usr/bin/env python
# Author:hongjie.gao

# 函数在定义阶段只检测语法,不执行代码
# def func():
#     print('aaaaa')
#     xxxxxx
#     yyyyyyy
#     zzzz
#     dadada
    # if
    # print('dadadadad')

print(func)  # 不报错(查看函数在内存地址的位置)
func()      # 会报错

先定义后使用

#/usr/bin/env python
# Author:hongjie.gao

# 1.函数的使用必须遵循先定义,后调用
# 2.函数的定义,就相当于在定义一个变量,如果没有定义而直接调用,就相当于在引用一个不存在的变量名

# 定义阶段
# def foo():
#     print('from foo')
#     bar()   # 不报错
# # 调用阶段
# foo()           # 包错
#

# 1.不报错
# 定义阶段
def bar():
    print('from bar')
def foo():
    print('from foo')
    bar()
# 调用阶段
foo()

# 2.不报错
# 定义阶段
def bar():
    print('from bar')
def foo():
    print('from foo')
    bar()
# 调用阶段
foo()

调用函数

#/usr/bin/env python
# Author:hongjie.gao

# 1.调用函数 :函数名()
# 需要注意:先通过名字找到函数的内存地址,然后加()调用




# 2.函数的返回值return
# 在调用函数的过程中,一旦执行到return,就会立刻终止函数,并且把return后的结果当做本次调用的返回值返回
# 函数体内可以有多个return但是只能执行一次

# def foo():
#     print('1111')
#     return 1
#     # print('2222')
#     # return 2
#     # print('33333')
#     # return 3
# res=foo()
# print('函数调用完毕:',res)

# 注意第二点
# 返回的值可以是任意类型
# def foo():
#     return [1,2,3]
# res=foo()
# print('函数调用完毕:',type(res))

# 注意第三点:
#没有return,pyrhon会默认返回None
# def foo():
#     pass
# res=foo()
# print('函数调用完毕:',res,type(res))
# 可以返回一个值======》值
# 可以用逗号分隔,返回多个值====tuple
# def foo():
#     return 1,2,[],{'a':1}
# res=foo()
# print('函数调用完毕:',res,type(res))



# 3.调用函数的三种形式
def foo():
    print('from foo')
    return 123

#
# foo()

#
# res=foo()
# print(res)

#
res=foo()*10
print(res)

 

函数的参数

#/usr/bin/env python
# Author:hongjie.gao

# 形参:在定义函数时,括号内的参数称为形参
# 特点:形参就是变量名
# def foo(x,y):
#     print(x)
#     print(y)


# 实参:在调用函数时,括号内的参数称为实参
# 特点:实参就是变量值

# 在调用阶段实参(变量值)才会绑定到形参(变量名)
# 调用结束后解除绑定



# 参数的分类
# 位置参数:按照从左到右的顺序依次定义的参数
         #位置形参:必须被传值,并且多一个不行,少一个不行
#       # 位置实参:与形参按照位置一一对应
# def foo(x, y):
#     print(x)
#     print(y)
#
# foo('egon',1)
#

# 关键字实参  :指的是按照name=value的形式,指名道姓的给name传值
# def foo(name, age):
#     print(name)
#     print(age)
#
# foo(age=18,name='egon')
# 关键字实参需要注意的问题是:
# def foo(name, age,sex):
#     print(name)
#     print(age)
#     print(sex)
#
# foo('egon',18,'male')
# print('=======>')
# foo(age=18,name='egon',sex='male')
# print('======>')
# foo('egon',sex='male',age=18)
# w问题一:语法规定:位置实参必须在关键字实参前面



# 三:默认参数:在定义函数阶段,已经为形参赋值了,在定义阶段已经赋值,意味着在调用阶段可以不传值
# 注意的问题:
#       1.默认参数的值,只在定义时赋值一次
#       2.位置形参应该在默认参数的前面
#       3.默认参数的值应该是不可变类型
# def foo (x,y=10):
#     print(x,y)
# foo(1)
# foo(x=1)
# foo(1,y=11)

# def register (name,age,sex='male'):
#     print(name,age,sex)
#
# register('egon',18)
# register('wsb',20)
# register('alex',38,None)

'''
四:可变长参数:
实参的可变长度指的是:实参值得个数是不固定
而实参的定义形式无非两种:1.位置实参 2.关键字实参
针对这两种形式的实参个数不固定,相应的,形参也要有两种解决方案
*
**
'''
# 针对按照位置定义的溢出的那部分实参,形参用:*args
# def func(x,y,z,*args):   #args=(4,5,6)
#     print(x,y,z)
#     print(args)
# func(1,2,3)
# func(1,2,3,4,5,6)
# func(1,2,3,*[4,5,6])  #func(1,2,3,4,5,6)
# func(*[1,2,3,4,5,6])     #func(1,2,3,4,5,6)

# def func(x,y,z):
#     print(x,y,z)
#
# l=[1,2,3]
# func(*l)

# # 针对按照关键字定义的溢出的那部分实参,形参用:**kwargs
# def foo(x,y,**kwargs):      # kwargs={'z': 11, 'a': 21, 'b': 90}
#     print(x,y)
#     print(kwargs)
# foo(y=2,x=1,z=11,a=21,b=90)

# def foo(a,b,*args,**kwargs):
#     print(a,b)
#     print(args)
#     print(kwargs)
# # foo(1,2,3,x=22,y=33)
#
# foo(1,2,*[3],**{'x':22,'y':33})   #foo(1,2,3,x=22,y=33)

# def home(name,age,sex):
#     print(name,age,sex)
#
#
# def wrapper(*args,**kwargs):
#     print(args)
#     print(kwargs)
#
# wrapper(1,2,3,4,a=1,b=2)



# 命名关键字参数(了解),
# 形参在*后定义的参数称之为命名关键字参数
# 它的特性是:传值时必须按照关键字实参的形式传值
def foo(a,b,*,x,y):
    print(a,b,x,y)
foo(1,2,x=3,y=4)


# 位置参数,默认参数,*args,命名关键字参数,**kwargs

 

函数的对象

#函数是第一类对象:函数可以当做数据来使用
def foo():
    print('from foo')

#可以被引用
# f=foo
# # print(f)
# f()

#可以当做参数传入一个函数
# def wrapper(x):
#     # print(x)
#     x()
# wrapper(foo)



#可以当做函数的返回值
# def wrapper():
#     return foo
#
# f=wrapper()
# print(f is foo)

#可以当做容器类型的一个元素

# l=[foo,1,2]
# l[0]()

data_dir='/usr/local/mysql/data'
def select(sql):
    print('select功能: ',sql)

def insert(sql):
    print('insert功能: ', sql)

def update(sql):
    print('update功能: ', sql)

def delete(sql):
    print('delete功能: ', sql)

def alter(sql):
    print('alter功能:',sql)

func_dic={
    'select':select,
    'update':update,
    'insert':insert,
    'delete':delete,
    'alter':alter
}

def main():
    while True:
        inp=input('>>: ').strip()
        if not inp:continue
        sql=inp.split()
        cmd=sql[0]
        # if cmd == 'select':
        #     select(sql)
        # elif cmd == 'update':
        #     update(sql)
        # elif cmd == 'insert':
        #     insert(sql)
        # elif cmd == 'delete':
        #     delete(sql)
        if cmd in func_dic:
            func_dic[cmd](sql)
        else:
            print('command not found')

main()

函数嵌套

#1 函数的嵌套调用:在调用一个函数的过程中,又调用其他的函数
# def my_max2(x,y):
#     if x > y:
#         return x
#     else:
#         return y
#
#
# def my_max4(a,b,c,d):
#     res1=my_max2(a,b)
#     res2=my_max2(res1,c)
#     res3=my_max2(res2,d)
#     return res3
#
# res=my_max4(1,2,3,4)
# print(res)

#2 函数的嵌套定义:在定义一个函数内部,又定义了一个函数
def f1():
    def f2():
        def f3():
            print('from f3')
        f3()
    x=1
    f2()
    print(x)
f1()

# f2()
# print(x)

 

名称空间和作用域

名称空间:存放名字与值绑定关系的地方


内置名称空间:
    存放的是:内置的名字与值的绑定关系
    生效:python解释器启动
    失效:Python解释器关闭

全局名称空间
    存放的是:文件级别定义的名字与值的绑定
    生效:执行python文件时,将该文件级别定义的名字与值的绑定关系存放起来
    失效:文件执行完毕

局部名称空间
    存放的是:函数内部定义的名字与值的绑定关系
    生效:调用函数时,临时生效
    失效:函数调用结束

加载顺序:先内置,再全局,最后局部
查找名字的顺序:先局部,再全局,最后内置

'''

# x=10
# if x > 3:
#     y=2
#
# def foo(a,b): #a='aaaa' b='bbbb'
#     m=11111
#     n=2222
#     def bar():pass
#
# foo('aaaa','bbbb')


# max=10
# def f1():
#     max='f1'
#     def f2():
#         max='f2'
#         print(max)
#     f2()
#
# # f1()
# print(max)


'''
作用域:
全局作用域:包含内置名称空间的名字与全局名称空间的名字
            全局存活,全局有效

局部作用域:包含局部名称空间的名字
            临时存活,局部有效

'''



#
# x=1011111111111111111111111111111111111111111
# def f1(a):
#     y='fffffffffffffffffffffffffffffff1'
#     print(locals())
#     print(globals())


# print(globals())
# print(dir(globals()['__builtins__']))

# print(locals() is globals())


# f1(12321312312312312312312312312312312312313213)




#作用域关系,在函数定义时,就已经固定了,与调用位置无关
# x=10000000000000000000000000
# def f1():
#     def f2():
#         # x='123123123123123123123123123123123'
#         print(x)
#     return f2
#
# f=f1()
#
# # print(f)
#
#
# def func():
#     x=123
#     f()
# x='hello'
# func()





#global nonlocal
# x=1
# def f1():
#     global x
#     x=10
# f1()
# print(x)



x=1
def f1():
    x=2
    def f2():
        nonlocal x
        x=111111
    f2()
    print(x)

f1()


 

原文地址:https://www.cnblogs.com/huangtiandi001/p/7576412.html