Python基础第六天

---恢复内容开始---

函数

一:函数定义

def test():
    x=3
    y=2*x+1
    return y
a=test( )   #运行test,并将结果放在a中。
print(a)

def:定义函数的关键字

test:函数名

():内可定义形参

return:定义返回值

二:函数的返回值

      当一个函数/过程没有使用return显示的定义返回值时,python解释器会隐式的返回None,

       返回值=1,返回object

       返回值>1,返回tuple

def test01():
      msg='hello The little green frog'
      print(msg)

def test02():
     msg='hello WuDaLang'
     print(msg)
     return msg

t1=test01()
t2=test02()

print(t1)
print(t2)

hello The little green frog
hello WuDaLang
None
hello WuDaLang

三:函数参数:位置参数   关键字参数  默认参数

def calc(x,y):
     res = x**y
     return res
 c = calc(2,3)
 print(c)         #关键字参数




def test(x,y,z):
     print(x)
     print(y)
     print(z)
 test(y=1,x=3,z=4)     #位置参数
位置参数,必须一一对应,缺一行不行多一行也不行
关键字参数,无序一一对应,缺一行不行多一行也不行
test(1,y=2,3)报错
test(1,3,y=2)报错
test(1,3,z=2,y=4)报错
位置参数必须在关键字参数左边

参数组:**字典 *列表
#*args 处理的是位置参数,处理成列表
def test(x,*args):#*args   以元祖传给args
    print(x)
    print(args)
# test(1,2,3,4,5)
# test('alex',{'name':'alex'})
test(1,*['x','y','z'])
test(1,*('x','y','z'))

#**kwargs 处理的是关键字参数
def test(x,**kwargs):
    print(x)
    print(kwargs)
test(1,y=2,z=3)

def test(x,*args,**kwargs):
    print(x)
    print(args)
    print(kwargs)
test(1,y=2,z=3)

四:局部变量和全局变量

      在子程序中定义的变量称为局部变量,在程序的一开始定义的变量称为全局变量。全局变量作用域是整个程序,局部变量作用域是定义该变量的子程序。

当全局变量与局部变量同名时:在定义局部变量的子程序内,局部变量起作用;在其它地方全局变量起作用。
name = 'lhf'
def change_name():
    name = '随后绝对是'
    print('change_name', name)
change_name()

#如果函数的内容无global关键字,优先读取局部变量,可以全局变量,无法对全局变量重新赋值,但是对于变量是可变类型,可以对内部元素进行操作。
#如果函数中有global关键字,变量本质就是全局变量,可读取可赋值。
########全局变量变量名大写,局部变量变量名小写
有关函数的内容有无global关键字--有无声明局部变量例子:
#函数的内容无global关键字----有声明局部变量
NAME =['gh','hj']
def ghjhjk():
    NAME ='TY'
    print('i am',NAME)
ghjhjk()
#函数的内容无global关键字----无声明局部变量
NAME =['gh','hj']
def ghjhjk():
    NAME.append('rtyu')
    print('i am',NAME)
ghjhjk()
#函数的内容有global关键字
NAME =['gh','hj']
def ghjhjk():
    global NAME
    NAME =['内牛满面']
    print('i am',NAME)
ghjhjk()

NAME ='海风'
def huangwei():
    name = '黄伟'
    print(name)
    def liuyang():
        name ='刘洋'
        print(name)
        def nulige():
            name = '胡志华'
            print(name)
        print(name)
        nulige()
    liuyang()
    print(name)
huangwei()

name = '刚娘'
def weihou():
    name = '陈卓'
    def weiweihou():
        global name
        name = '冷静'
    weiweihou()
    print(name)

print(name)
weihou()
print(name)

name = '刚娘'

def weihou():
    name = '陈卓'
    def weiweihou():
        nonlocal name
        name = '冷静'
    weiweihou()
    print(name)

print(name)
weihou()
print(name)
View Code

五:函数递归

   在函数内部,可以调用其他函数。如果一个函数在内部调用自身本身,这个函数就是递归函数。

  递归特性:

1. 必须有一个明确的结束条件  return

2. 每次进入更深一层递归时,问题规模相比上次递归都应有所减少

3. 递归效率不高

import time

person_list=['alex','wupeiqi','yuanhao','linhaifeng']
def ask_way(person_list):
    print('-'*60)
    if len(person_list) == 0:
        return '没人知道'
    person=person_list.pop(0)
    if person == 'linhaifeng':
        return '%s说:我知道,老男孩就在沙河汇德商厦,下地铁就是' %person
    print('hi 美男[%s],敢问路在何方' %person)
    print('%s回答道:我不知道,但念你慧眼识猪,你等着,我帮你问问%s...' %(person,person_list))
    time.sleep(3)
    res=ask_way(person_list)
    # print('%s问的结果是: %res' %(person,res))
    return res
res=ask_way(person_list)
print(res)

def calc(n):
    print(n)
    if int(n/2) ==0:
        return  n
    return calc(int(n/2))
calc(10)

ls =[]

def test(n):
    n =int(n/2)
    ls.append(n)
    if int(n/2) ==1:
        return  ls
    test(n)

print(test(5))
View Code

六:作用域

def test1():  #函数名相当于内存地址,加括号test()相当于运行
    print('in the test1')  #没有返回值时,返回None
def test():
    print('in the test')
    return  test1
res=test()
print(res())


in the test
in the test1
None
# 例一:
name='alex'

def foo():
    name='lhf'
    def bar():
        print(name)
    return bar

func=foo()  #执行foo 将结果“返回bar”给func
func()   #执行func即执行bar

# 例二:
name='alex'

def foo():
    name='lhf'
    def bar():
        name='wupeiqi'
        def tt():
            print(name)
        return tt
    return bar

func=foo()
func()() #运行tt
两个好例子

七:匿名函数

#这段代码
def calc(n):
    return n**n
print(calc(10))
 
#换成匿名函数
calc = lambda n:n**n
print(calc(10))

lambda 匿名函数(形参名):函数表达式(处理逻辑){ps:一般为return返回最终结果}

name='alex'
def change_name(x):
    return name+'_sb'
res=change_name(name)
print(res)

f=lambda x:x+'_sb'
res=f(name)
print('匿名函数的运行结果',res)

 下一集:函数式编程。。。

相关推荐