首页 > 代码库 > Python基础day-6[函数,命名空间,作用域]

Python基础day-6[函数,命名空间,作用域]

函数的返回值

  通常有参函数是需要返回值的。
  返回值的几种形式:
    1.如果函数内没有return就返回None
    2.return 返回的数据类型没有限制,也可以返回多个值,以元组形式,括号可加可不加
  return的效果:
    终止函数的执行,只能返回一次值.

  函数参数的使用
    python是一种弱类型的语言,参数可以传入任何类型数据
    形参与实参:可以理解为形参就是变量名,而实参就是变量值
def foo(x,y) #x,y 是形参
  return x+y
foo(1,2) #1,2 是实参
    位置参数:按照从左到右的顺序依次定义的参数叫位置参数。
def foo(x,y): #按位置定义的形参,必须被传值,多一个少一个都不行。
  print(x)
  print(y)
foo(1,2) #按位置定义的实参,会一一跟形参对应。
    关键字参数:指的是实参在定义时,按照key=value形式定义。
def foo(x,y): #形参还是按位置定义的。
  print(x)
  print(y)
foo(y=1,x=2) #打破位置的限制,不需要跟形参一一对应,直接指定传值。但是还要遵循不能多不能少。
  注意的问题:
    1.位置实参可以和关键字实参混合使用,但是位置实参必须在关键字实参的前面。
    2.位置实参可以和关键字实参混合使用,但是一个形参只能被传值一次不能被重复传值。
    默认参数:定义函数阶段,就已经为形参赋值。
def foo(x, y=10): # 形参在定义的时候赋值。
  print(x)
  print(y)
foo(x=2) # 实参可以不输入对应的形参,如果输入了就不使用默认参数。
  注意的问题:
    1.必须放在位置参数后面。
    2.默认参数通常要定义成不可变类型。
    3.默认参数只在定义时被赋值一次。


形参的应用:值经常变化的需要定义成位置形参,值大多数情况下都一样需要定义默认参数。
实参的应用:怎么爽怎么用,但是要遵循相应的规则。

    可变长参数:可变长值得是实参的个数不固定 *号等同位置参数
      按位置定义的可变长实参:*
      按关键字定义的可变长实参:**
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) #实参为位置参数使用*args
func(1,2,*(3,4,5,6)) #等同于 func(1,2,3,4,5,6)

D:\Python\Python36-32\python.exe E:/Python/DAY-6/tmp.py
1 2
(3, 4, 5, 6)
1 2
(3, 4, 5, 6)

Process finished with exit code 0

 

def func(x, y, **kwargs): # x=1 y=2, kwargs={‘z’:6} 字典形式
  print(x, y)
  print(kwargs)
func(x=2, y=4, z=6) #实参为关键字使用**kwargs

D:\Python\Python36-32\python.exe E:/Python/DAY-6/tmp.py
2 4
{z: 6}

Process finished with exit code 0

    命名关键字参数:*后面定义的形参(*,name,age)必须以关键字形式被传值
def regist(*,name,age):
  print(name)
  print(age)
regist(name=‘abc‘,age=11)

D:\Python\Python36-32\python.exe E:/Python/DAY-6/tmp.py
abc
11

Process finished with exit code 0

形参:位置参数,默认参数,*.args 命名关键字参数,**kwargs  #一般定义形参就按照这种顺序


  函数的嵌套调用
def max2(x,y):
  if x > y:
    return x
  else:
    return y
def mx4(a,b,c,d):
  res1=max2(a,b)
  res2=max2(res1,c)
  res3=max2(res2,d)
  return res3
  函数的嵌套定义:函数中定义函数,并且只能在同级调用
def f1():
  def f2():
    def f3:
      print(‘f3‘)
    print(‘f2‘)
  print(‘f1‘)

名称空间与作用域
  命名空间:存放名字与值的绑定关系
  种类:
  内置名称空间
    内置在Python解释器内的自带的名字,解释器一启动就生成这个空间
  全局名称空间
    文件级别定义的名字都会存放于全局名称空间,执行python文件时会产生,下面示例
x = 1
def func():
  pass
class foo:
  pass
import os
if 1 > 2:
  y = 3 #这里y没有顶头写但也是全局变量
  局部名称空间
    定义在函数内部的名字,
    局部名称空间只有在调用函数的时候生效,执行完毕失效


三种加载顺序:内置=====>全局======>局部
取值:局部>全局>内置

示例:
max = 10
def tmp():
max = 20
print(max)
tmp() #会打印出20 因为局部优先于全局


  作用域:作用范围
  种类:
    全局作用域
      内置名称空间和全局名称空间的名字,作用范围是全局范围。在整个文件的任意位置都能被引用,全局有效。
    局部作用域
      局部名称空间中的名字,作用范围是局部范围生效。只在函数内部可被引用,局部有效

局部作用域=====>全局作用域
函数的作用域在定义的时候就已经固定死了。
补充:
搜寻变量时,只能由“内”看“外”。不可以反过来。例如在函数内部定义的变量,无法在全局被直接引用。
但是如果在函数内部引用一个变量,但是函数内没有定义,那么会去全局作用域搜寻变量。
x = 1
def func():
x =2
print(globals()) #打印全局作用域name
print(locals()) #打印局部作用域name
func()


函数对象:函数是第一类对象,指的是函数可以被当数据传递
可以被引用,可以当函数的返回值,可以当容器的元素

Python基础day-6[函数,命名空间,作用域]