python学习六(基础知识)

python基础学习六


本章内容

  1. 函数定义
  2. 函数参数
  3. 函数变量
  4. 函数返回语句return
  5. 函数嵌套
  6. 函数递归
  7. 匿名函数
  8. 高阶函数
  9. 内置函数
  10. 闭包函数

 

1.函数定义

定义:

  • 函数代码块以 def 关键词开头,后接函数标识符名称和圆括号 ()
  • 任何传入参数和自变量必须放在圆括号中间,圆括号之间可以用于定义参数。
  • 函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明。
  • 函数内容以冒号起始,并且缩进。
  • return [表达式] 结束函数,选择性地返回一个值给调用方。不带表达式的return相当于返回 None。 

特性:

  1. 减少重复代码
  2. 使程序变的可扩展
  3. 使程序变得易维护

语法:

   def 函数名(参数列表):
       函数体

 实例:

def f():
    print("ok")
f()
f()

2.函数参数

 形参:变量只有在被调用时才分配内存单元,在调用结束时,即刻释放所分配的内存单元。因此,形参只在函数内部有效。函数调用结束返回主调用函数后则不能再使用该形参变量

实参:可以是常量、变量、表达式、函数等,无论实参是何种类型的量,在进行函数调用时,它们都必须有确定的值,以便把这些值传送给形参。因此应预先用赋值,输入等办法使参数获得确定值

#形参x,y
def add(x,y):
    print(x+y)

#实参7,5 和5,8
add(7, 5)
add(5, 8)

关键字参数:

和函数调用关系紧密,函数调用使用关键字参数来确定传入的参数值。

使用关键字参数允许函数调用时参数的顺序与声明时不一致,因为 Python 解释器能够用参数名匹配参数值。

def stu_register(name,age,country,course):
    print("----注册学生信息------")
    print("姓名:",name)
    print("age:",age)
    print("国籍:",country)
    print("课程:",course)

stu_register(age=22,name='alex',course="python",)

默认参数:

调用函数时,如果没有传递参数,则会使用默认参数。

def prinf_info(name, age, sex='male'):
    print("Name: %s" %name)
    print("Age: %d" %age)
    print("Sex; %s" %sex)

f = prinf_info("hzw", 29)

不定长参数:

*args 会把多传入的参数变成一个元组tuple形式导入
def add(*args):
    print(args)
    sum = 0
    for i in args:
        sum += i
    print(sum)
add(1,2,3,4,5)
**kwargs 会把多传入的参数变成一个dict形式导入
def p_info(*args,**kwargs):
    print(args)
    print(kwargs)
    for i in kwargs:
        print("%s: %s" %(i,kwargs[i]))
p_info("alex", 18, 'male',job="IT",hobby="girls",height=185)

3.函数变量

变量作用域:

Python的作用域一共有4种,分别是:

  • L (Local) 局部作用域
  • E (Enclosing) 闭包函数外的函数中
  • G (Global) 全局作用域
  • B (Built-in) 内置作用域(内置函数所在模块的范围)

以 L –> E –> G –>B 的规则查找,即:在局部找不到,便会去局部外的局部找(例如闭包),再找不到就会去全局找,再者去内置中找。

g_count = 0  # 全局作用域
def outer():
    o_count = 1  # 闭包函数外的函数中
    def inner():
        i_count = 2  # 局部作用域

内置作用域是通过一个名为 builtin 的标准模块来实现的,但是这个变量名自身并没有放入内置作用域内,所以必须导入这个文件才能够使用它。

import builtins
dir(builtins)

全局与局部变量:

定义在函数内部的变量拥有一个局部作用域,定义在函数外的拥有全局作用域。

局部变量只能在其被声明的函数内部访问,而全局变量可以在整个程序范围内访问。调用函数时,所有在函数内声明的变量名称都将被加入到作用域中。

total = 0 # 这是一个全局变量
# 可写函数说明
def sum( arg1, arg2 ):
    #返回2个参数的和."
    total = arg1 + arg2 # total在这里是局部变量.
    print ("函数内是局部变量 : ", total)
    return total
 
#调用sum函数
sum( 10, 20 )
print ("函数外是全局变量 : ", total)

 

global 和 nonlocal关键字:

当内部作用域想修改外部作用域的变量时,就要用到global和nonlocal关键字了。

修改全局变量

um = 1
def fun1():
    global num  # 需要使用 global 关键字声明
    print(num) 
    num = 123
    print(num)
fun1()
print(num)

修改修改嵌套作用域变量

def outer():
    num = 10
    def inner():
        nonlocal num   # nonlocal关键字声明
        num = 100
        print(num)
    inner()
    print(num)
outer()

 

4.函数返回语句return

 return [表达式] 语句用于退出函数,选择性地向调用方返回一个表达式。不带参数值的return语句返回None。

# 可写函数说明
def sum( arg1, arg2 ):
   # 返回2个参数的和."
   total = arg1 + arg2
   print ("函数内 : ", total)
   return total
 
# 调用sum函数
total = sum( 10, 20 )
print ("函数外 : ", total)

5.函数嵌套

 在一个函数中定义了另外一个函数,内部函数不能被外部直接使用,会抛NameError异常

def outer():
  def inner():
    print('inner ok')
  print('outer ok')
  inner()
outer()
inner()    # 此句会出错

6.函数递归

 在函数内调用当前函数本身的函数就是递归函数

 实例一:1*2*3*4....

def f(n):
    if n == 1:
        return 1
    return n*f(n-1)

print(f(5))

实例二:使用递归斐波那契数列  0 1 1 2 3 5 8 13 21 34 55 ...

def fibo(n):
    if n <= 1:
        return n
    return fibo(n-1)+fibo(n-2)

print(fibo(5))

7.匿名函数

 python 使用 lambda 来创建匿名函数

语法:

lambda [arg1 [,arg2,.....argn]]:expression

实例:

# 可写函数说明
sum = lambda arg1, arg2: arg1 + arg2
 
# 调用sum函数
print ("相加后的值为 : ", sum( 10, 20 ))
print ("相加后的值为 : ", sum( 20, 20 ))

8.高阶函数

 变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数就称之为高阶函数。

def f(n):
    return n*n

def foo(a,b,func):
    return  func(a)+func(b)

a = foo(1,2,f)
print(a)

9.内置函数

 

10.闭包函数

条件:

1)必须嵌套函数
2)内嵌函数必须引用一个定义在闭合范围内(外部函数里)的变量——内部函数引用外部变量
3)外部函数必须返回内嵌函数——必须返回那个内部函数

语法:

def 外层函数(参数):
    def 内层函数():
        print("内层函数执行", 参数)
    return 内层函数
内层函数的引用 = 外层函数("传入参数")
内层函数的引用()

实例:

def outer():
    x = 10
    def inner(): #条件一:inner 是内部函数
        print(x) #条件二:外部环境的一个变量
    return inner #结论: 内部函数inner就是一个闭包

f = outer()

 

posted @ 2019-07-07 11:03  hzw2019  阅读(37)  评论(0)    收藏  举报