• Python开发基础 day5 函数的定义与使用


    #coding:utf-8:
    # x='' # u'hello'
    
    # print(x.encode('gbk'))
    # print(b'xc4xe3')
    
    # y=b'xc4xe3'
    # print(y.decode('gbk'))
    
     
    
     
    
    
    # x='' #unicode.encode('utf-8')
    
     
    
    y=u''
    print repr(y)
    
    
    # while True:
    # msg=input('>>: ')
    #
    # # print(len(msg))
    # # res=len(msg)
    # # if res < 5:
    # # continue
    # # else:break
    #
    #
    # if len(msg) < 5:
    # continue
    # else:break
    #
    # with open('a.txt') as f:
    # for i in f.readlines():
    # print(i,end='')
    
    # with open('a.txt') as f:
    # for i in f:
    # print(i,end='')
    
    
    # with open('a.txt') as f:
    # print(f.readline(),end='')
    # print(f.readline(),end='')
    # print(f.readline(),end='')
    # print(f.readline(),end='')
    # print(f.readline(), end='')
    # print(f.readline(), end='')
    
    
    # with open('a.txt','r',encoding='utf-8') as f:
    # print(len(f.read()))
    
    
    # with open('a.txt','rb') as f:
    # file_size=len(f.read())
    
    
    # import os
    # print(os.path.getsize('a.txt'))



    函数参数的使用:



    # def foo(x): # print(x) # # # foo(
    1) # foo('a') # foo({'a':2}) #形参与实参: # def foo(x,y): #x=1,y=2 # return x+y # # foo(1,2)

     

    #===================================part1
    #位置参数:按照从左到右的顺序依次定义的参数
    def foo(x,y):
    print(x)
    print(y)
    #按位置定义的形参,必须被传值,多一个不行,少一个也不行
    
    # foo(1,2,3)
    
    
    #按位置定义的实参,与形参一一对应
    # foo(2,10)
    
    
    
     

     

    #===================================part2
    #关键字参数:实参在定义时,按照key=value形式定义

    # def foo(x,y):
    # print(x)
    # print(y)
    #
    # # foo(y=10,x=1)
    # foo(y=10,x=1) #关键字参数可以不用像位置实参一样与形参一一对应,指名道姓地传值

     

    def foo(x,y):
    print(x)
    print(y)
    
    
    # foo(1,10)
    # foo(x=1,y=10)
    # foo(1,y=10)
    # foo(y=10,1)
    # foo(x=10,1)
    
    # foo(1,x=10,y=20)
    
    
    # def foo(x,y,z):
    # print(x)
    # print(y)
    # print(z)
    # # foo(1,z=20,10)
    # foo(1,y=2,z=10)

    #注意的问题一:位置实参必须在关键字实参的前面
    #注意的问题二:实参的形式既可以用位置实参又可以是关键字实参,但是一个形参不能重复传值

     


    #===================================part3
    #默认参数:在定义函数阶段,就已经为形参赋值,定义阶段有值,调用阶段可以不用传值

    # def func(x,y=10):
    # print(x)
    # print(y)
    
    
    # func(1,20)
    # func(1)
    
     
    
    # def func(y=10,x):
    # print(x)
    # print(y)

     

    #位置实参
    #关键字实参

    #位置形参
    #默认参数(形参)


    #形参的应用:值经常变化的需要定义成位置形参,
    # 值大多数情况下都一样,需要定义成默认参数

    # def register(name,age,sex='male'):
    # print(name,age,sex)
    #
    # register('alex',1000)
    # register('wupeiqi',9000)
    # register('yuanhao',10000)
    # register('王铁蛋',10000,'female')

     

     

     

    #默认参数需要注意的问题一:必须放在位置形参后面
    #默认参数需要注意的问题二:默认参数通常要定义成不可变类型
    #默认参数需要注意的问题三:默认参数只在定义阶段被赋值一次

    # x=10
    # def func(name,age=x):
    # print(name)
    # print(age)
    # x=20
    #
    # func('egon')
    
     
    
     
    
    # def func(name,age=10,sex='male',hobby=['play1','play2']):
    # print(name)
    # print(age)
    # print(hobby)
    #
    # func('egon')

    #===================================part4
    #可变长参数:可变长指的是实参的个数不固定
    #按位置定义的可变长度的实参:*
    #按关键字定义的可变长度的实参:**

    #
    # def func(x,y,*args): #x=1,y=2,args=(3,4,5,6)
    # print(x,y)
    # print(args)
    #
    # func(1,2,3,4,5,6)
    
     
    
    
    # def func(x,y,*args): #args=(3,4,5,6)
    # print(x,y)
    # print(args)
    #
    # func(1,2,*(3,4,5,6)) #foo(1,2,3,4,5,6)
    
    
    # def func(x,y,z):
    # print(x,y,z)
    #
    # # func(1,*(2,3)) #func(1,2,3)
    # func(*(2,3)) #func(2,3)
    
     
    
    #
    # def func(x,y=2,z=1):
    # print(x,y,z)
    #
    #
    # func(*('a','b','c')) #func('a','b','c')

     

     

     

     

    # def func(x,y,**kwargs): #x=1,y=2,kwargs={'a':1,'b':3,'z':3}
    # print(x,y)
    # print(kwargs)
    #
    # func(1,y=2,z=3,a=1,b=3)
    
     
    
     
    
    # def func(x,y,**kwargs): #x=1,y=2,**kwargs=**{'a':1,'b':3,'z':3}
    # print(x,y)
    # print(kwargs)
    #
    # func(1,y=2,**{'a':1,'b':3,'z':3}) #func(1,y=2,z=3,b=3,a=1)
    
    
    # def func(x,y=1,z=1):
    # print(x,y,z)
    #
    # func(**{'y':2,'x':1,'z':3}) #
    
     
    
    
    # def wrapper(*args,**kwargs): #可以接受任意形式,任意长度的参数
    # print(args)
    # print(kwargs)
    #
    #
    # wrapper(1,2,3,3,3,3,3,x=1,y=2,z=3)
    
     
    
    
    #
    # def index(name,group):
    # print('welcome %s to index page,group is: %s' %(name,group))
    #
    # def wrapper(*args,**kwargs): #可以接受任意形式,任意长度的参数
    # # print(args) #args=(1,2,3)
    # # print(kwargs) #kwargs={'x':1,'y':2,'z':3}
    # index(*args,**kwargs) #index(*(1,2,3),**{'x':1,'y':2,'z':3}) #index(1,2,3,z=3,y=2,x=1)
    #
    # wrapper(name='egon',group='group1')
    
     
    
     
    
     
    
    
    #命名关键字参数:定义在*后的形参,这类形参,必须被传值,而且要求实参必须是以关键字的形式来传值
    
    # def register(**kwargs):
    # print(kwargs)
    # if 'name' in kwargs:
    # print(kwargs['name'])
    # if 'age' in kwargs:
    # print(kwargs['age'])
    #
    #
    # # register(name='egon',age=18)
    # register()
    
     
    
    # def register(*args,name='egon',age):
    # print(args)
    # print(name)
    # print(age)
    #
    # # register(name='egon',age=18)
    # register(1,2,2,3,age=10)
    
     
    
    #
    # def register(name,age,*,group,**kwargs):
    # print(name)
    # print(age)
    # print(kwargs)
    #
    #
    # # register('egon',18)
    # register('egon1',18,hobby='paly1',group='group1')
    
    
    # def func(x,y=1,*args,z,**kwargs):
    # print(x)
    # print(y)
    # print(args)
    # print(z)
    # print(kwargs)
    #
    # func(1,2,3,4,5,z=10,a=1,b=2)
    
     
    
    #
    # def func(x,*args,z=1,**kwargs):
    # print(x)
    # print(args)
    # print(z)
    # print(kwargs)
    #
    # func(1,2,3,4,5,a=1,b=2,c=3)

     

     


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

    函数的返回值:

    # y=x**2
    
     
    
     
    
     
    
    # def func(x):
    # return x**2
    # y=func(10) # 10**2
    #
    # print(y)
    
     
    
     
    
     
    
    # def foo():
    # return None
    #
    # res=foo()
    # print(res)
    
     
    
    
    # def foo():
    # return {'a':1}
    #
    # res=foo()
    # print(res['a'])
    
     
    
     
    
     
    
    # def foo():
    # return {'a':1},1,'a',[1,2]
    #
    # res=foo()
    # print(res)
    
     
    
    
    '''
    返回值:可以返回任意类型
    没有return:None
    return value: value
    return val1,val2,val3 :(val1,val2,val3)
    
     
    
    
    return的效果:只能返回一次值,终止函数的执行
    '''
    
     
    
    
    def foo():
    return 1
    print('=====>')
    return 2
    return 3
    return 4
    
     
    
    print(foo())

     函数的使用原则:

     

    #函数的使用必须遵循:先定义后使用的原则

    #函数的定义,与变量的定义是相似的,如果没有事先定义函数而直接引用
    #就相当于在引用一个不存在变量名

    # print(x) #NameError
    # x=1
    
    
    # func
    #
    # def func():
    # print('hello world')
    
    
     
    
    
     
    
    
    # def func():
    # print('hello world')
    #
    # # print(func)
    # func()
    
    
     
    
    
     
    
    
    # def bar():
    # print('from bar')
    #
    # def foo():
    # print('from foo')
    # bar()
    #
    # foo()
    
    
     
    
    
    # #定义阶段
    # def foo():
    # print('from foo')
    # bar()
    #
    # def bar():
    # print('from bar')
    #
    # #调用阶段
    # foo()
    
    
    
    #定义阶段:只检测语法,不执行代码
    # def func():
    # if 1>2
    # print('hahahahahahah')
    
    
    
    def func(): #语法没问题,逻辑有问题,引用一个不存在的变量名
    asdfasdfasdfasdfasdf
    
    
     

    函数对象:

    #函数是第一类对象: 指的是函数可以被当做数据传递
    
    def func():
    print('from func')
    
    #可被引用
    # f=func
    
    #可以当做函数的参数
    # def func():
    # print('from func')
    # def foo(x):
    # print(x)
    # x()
    #
    # foo(func)
    
    #可以当做函数的返回值
    # def foo():
    # print('from foo')
    # def bar():
    # return foo
    # f=bar()
    # print(f)
    # print(foo)
    
    # x=0
    # def f1():
    # x=1
    # def f2():
    # # x=2
    # print(x)
    # return f2
    # f=f1()
    # # print(f)
    # f()
    
     
    
    #可以当做容器类型的元素
    # def select():
    # print('select function')
    #
    # func_dic={
    # 'select':select,
    # }
    #
    # # print(func_dic['select'])
    # func_dic['select']()
    
     
    
     
    
    
    #
    # def select():
    # print('select func')
    #
    # def delete():
    # print('delete func')
    #
    # def change():
    # print('change func')
    #
    # def add():
    # print('add func')
    #
    #
    # while 1:
    # cmd=input('>>: ').strip()
    # if not cmd:continue
    # if cmd == 'select':
    # select()
    # elif cmd == 'delete':
    # delete()
    # elif cmd == 'change':
    # change()
    # elif cmd == 'add':
    # add()
    # else:
    # print('无效的命令')
    
     
    
     
    
     
    
    def select(cmd_l):
    filename=cmd_l[-1]
    pattern=cmd_l[1]
    
    with open(filename,'r',encoding='utf-8') as f:
    for line in f:
    if pattern in line:
    print(line)
    
    
    def delete():
    print('delete func')
    
    def change():
    print('change func')
    
    def add():
    print('add func')
    
    def check():
    print('check func')
    
    
    func_dic={
    'select':select,
    'delete':delete,
    'change':change,
    'add':add,
    'check':check,
    }
    
    
    while 1:
    inp=input('>>: ').strip()
    if not inp:continue
    cmd_l=inp.split()
    # print(cmd_l)
    cmd=cmd_l[0]
    if cmd in func_dic:
    func_dic[cmd](cmd_l)
    else:
    print('无效的命令')

     函数嵌套:

    #函数的嵌套调用

    #
    # def max2(x,y):
    # if x > y:
    # return x
    # else:
    # return y
    #
    # def max4(a,b,c,d):
    # res1=max2(a,b) #23
    # res2=max2(res1,c) #23
    # res3=max2(res2,d) #31
    # return res3
    #
    #
    # print(max4(11,23,-7,31))

    #函数的嵌套定义

    def f1():
    def f2():
    def f3():
    print('from f3')
    print('from f2')
    f3()
    print('from f1')
    f2()
    # print(f1)
    f1()
    
    '''
    from f1
    from f2
    from f3
    
    '''

     

    名称空间与作用域:

    #名字空间:存放名字与值的绑定关系


    #名称空间分为三种


    #内置名称空间:python解释器自带的名字,python解释器启动就会生成

     

    #全局名称空间:文件级别定义的名字都会存放与全局名称空间,执行python文件时会产生

    # x=1
    # def func():
    # pass
    #
    # class Foo:
    # pass
    #
    # import os
    #
    # if 1 > 2 :
    # y=3
    
    #局部名称空间:定义在函数内部的名字,局部名称空间只有在调用函数时才会生效,函数调用结束则失效
    # def func(x,y): #x=1,y=2
    # z=3
    
    # func(1,2)

    #三者的加载顺序:内置名称空间->全局名称空间->局部名称空间

    #取值:局部名称空间->全局名称空间->内置名称空间

     

    # # max=10
    # def func(): #x=1
    # # max=20
    # print(max)
    #
    #
    # func()
    
     
    
    # max=10
    #
    # def func(): #x=1
    # max=20
    # # print(max)
    # func()
    #
    #
    # print(max)
    #
    
    
    # # x=0
    # def f1():
    # # x=1
    # def f2():
    # # x=2
    # def f3():
    # # x=3
    # print(x)
    # f3()
    # f2()
    #
    # f1()

    #作用域:作用范围
    #全局作用域:内置名称空间与全局名称空间的名字属于全局范围,
    # 在整个文件的任意位置都能被引用,全局有效
    #局部作用域:局部名称空间的名字属于局部范围,
    #只在函数内部可以被引用,局部有效

     

    # x=1
    # def foo():
    # def f2():
    # print(x)
    # f2()
    # def bar():
    # print(x)
    #
    # foo()
    # bar()
    
    
    # def f1():
    # x=1
    # def f2(): #f2=value
    # # x=2
    # print(x)
    # f2()
    # f1()
    
    
    x=1
    def func():
    x=2
    def f1():pass
    # print(dir(globals()['__builtins__'])) #全局作用域name
    # print(locals()) #局部作用域name
    
    func()
    
    print(globals() is locals())
    
    
    #局部作用域----->全局作用域
  • 相关阅读:
    uoj#207 共价大爷游长沙
    bzoj4006 [JLOI2015]管道连接
    bzoj2595 [Wc2008]游览计划
    uoj#300.【CTSC2017】吉夫特
    bzoj2565 最长双回文串
    bzoj2342 [Shoi2011]双倍回文
    bzoj3676 [Apio2014]回文串
    [转载]物理大神的八卦完整版——大爱物理
    低层次数论书籍大杂烩
    控制论课题
  • 原文地址:https://www.cnblogs.com/bsxq/p/7002996.html
Copyright © 2020-2023  润新知