增删改查 文件当作存放数据的仓库
做个工具和用户交互,可以处理用户命令
用户输入什么命令,就print什么命令
def select(x,y,z):
with open(z,'w',encoding='utf-8') as f:
for line in f:
if y in f:
print(line)
def delete():
print('delete func')
def change():
print('change func')
def add():
print('delete func')
func_dic = {
'select': select,
'add': add,
'change': change,
'del': delete
}
while True:
inp = input('>>: ').strip()
if not inp:
continue
cmd_l = inp.split(' ')
if cmd_l[0] in func_dic:
func_dic[cmd_l[0]](cmd_l[0], cmd_l[1], cmd_l[2])
else:
print('无效命令')
input('>>: ')
函数参数的使用
def func1():
if 1 > 2:
print('d')
else:
print('ok')
func1()
# 形参与实参
# 形参是变量名 实参是1 2,形参函数内
def foo(x,y):
return x+y
foo(1,2)
# 位置参数:按照从左到右的顺序一次定义的参数
# 按位置定义的形参,必须被传值,多一个不行,少一个也不行
# 按位置定义的实参,必须与形参一一对应
# 关键字参数:参数在定义时,按照key=value进行定义,形参与实参不必一一对应
func1(x=1, y=2, z=3)
func1(1,y=2) #混合,位置实参必须在关键字实参前面
# 一个形参只能被传值一次
# 默认参数:在定义函数阶段,就已经为形参赋值,调用阶段就无需传值。
def func1(x, y=10)
# 默认参数,必须放在位置形参后面
def func1(x=10, y) #不行!
# 默认参数通常要定义成不可变类型,只在定义阶段赋值一次
#可变长形参-分两种
def func2(x,y,*args): #多余的参数存储在元组里
print(x,y)
print(args)
func2(1,2,3,4,5,6)
func2(1,2,*(3,4,5,6)) #注意这种幅值方法
func2(*('a','b','c')) == func2('a','b','c')
def func3(x,y,**kwargs): # 多余的参数放在字典里 #多余的关键字参数被**接受,传给kwargs
print(x,y)
print(kwargs)
func2(y=2,x=1,z=3,a=5)
#命名关键字参数 #放置出现异常# 实参必须要以关键字传值
def register(*,name,age):
print(age)
print(name)
register(age=18)
register(name='alex',age=21)
def register(*args,name,age):
print(age)
print(name)
register(1,2,3,4,name='egon',age=10)
函数对象
# 可被引用
f = func()
# 可以当作函数的参数
# 可以当作函数的返回值
def foo():
print('from foo')
def bar():
return foo
f = bar()
print(f)
# 可以当作容器类型的元素: 字典,value为函数名
def select():
print('select function')
func_dict={
'select':select
}
func_dict['select']()
#
x = 0
def f1():
x = 1
def f2():
x = 2
print(x)
return f2
f = f1()
print(f)
f()
x = 1
def func1():
x = 2
def fun2():
x = 3
def fun3():
#global x
nonlocal x
x = 10000
print(x)
fun3()
print(x)
fun2()
func1()
名称空间和作用域
# 名称空间 :存放名字与值的绑定关系
# 名称空间分为三种:
# 内置名称空间:python解释器自带的名字,解释器启动就生成空间
# 全局名称空间:文件级别定义的名字都会存放在全局名称空间,执行python文件时会产生,顶头写的定义
x = 1
def fun1():
class Foo:
pass
import os
os.name
# 局部名称空间:定义在函数内部的名字,在函数调用阶段才会生效
#三者的加载顺序: 内置——全局--局部。
# 取值 内部函数顺序:局部-内置-全局
# 作用域:作用范围(生效分为)
x = 0
def f1():
x = 1
def f2():
x = 2
def f3():
x = 3
print(x)
f3()
f2()
f1()
# 全局作用域: 内置名称空间和全局名称空间的名字属于全局范围,在整个文件任意位置都能被调用,全局有效
def foo(x,y):
print(max(x,y))
foo(12,23)
# 局部作用域: 局部名称空间的名字,属于局部范围,只在函数内,局部有效
def foo(x,y):
def maxx(x,y):
if x > y:
return x
else:
return y
print(maxx(x,y))
# print(globals())
print(locals())
foo(12,23)
# 局部作用域-->全局作用域
print(globals())
print(dir(globals()['__builtins__']))
print(locals())
print(globals() is locals()) # 全局的局部是全局