jackyrar 发表于 2018-8-8 08:00:44

【12】Python函数学习(中)

  作用域、局部和全局变量
  前向引用:
  def test(name,age=18,*args,**kwargs):
  print(name)
  print(age,args,kwargs)
  school("Test")   #程序执行从上到下的,这里的school还没定义,所以执行报错。
  test('alex',age=20,flag="F",water=1.5)
  def school(source):
  print(source)
  运行结果:
  报错NameError: name 'school' is not defined
  正确写法:
  def test(name,age=18,*args,**kwargs):
  print(name)
  print(age,args,kwargs)
  school("Test")
  def school(source):
  print(source)
  test('alex',age=20,flag="F",water=1.5)
  运行结果:
  alex
  20 () {'flag': 'F', 'water': 1.5}
  Test
  局部变量(只在函数里生效,这个函数就是这个变量的作用域)
  def logers(name):
  print('before change:',name)
  name='ALEX'
  print('after change:',name)
  age=23
  name='alex'
  logers(name)
  print(name)
  print(age)#这里报错,NameError: name 'age' is not defined,,age属于局部变量,只能在局部生效。
  运行结果:
  before change: alex
  after change: ALEX
  alex
  全局变量(在顶层,第一级定义的变量都是全局变量)
  school='Oldboy'#顶层定义全局变量
  def logers(name):
  school="Mage"#局部变量
  print('before change:',name,school)
  name='ALEX'
  print('after change:',name)
  age=23
  name='alex'
  logers(name)
  print(name)
  #print(age)
  print(school)
  运行结果:
  before change: alex Mage#局部变量优先,虽然内部变了,但是全局变量还是没变。
  after change: ALEX
  alex
  Oldboy#全局变量
  改全局变量
  不要这么用1:
  school='Oldboy'
  def logers(name):
  global school#我要把函数的全局变量改了
  school="Mage"
  print('before change:',name,school)
  name='ALEX'
  print('after change:',name)
  age=23
  name='alex'
  logers(name)
  print(name)
  #print(age)
  print(school)
  运行结果:
  before change: alex Mage
  after change: ALEX
  alex
  Mage
  总结:

[*]  局部变量的作用域只在子程序(函数)中有效
  2、全局变量的作用域在整个程序
  3、全局变量配置在程序最顶层
  4、需要把全局变量改为局部变量那就用global 变量名(不要那么用)
  不要这么用2:(作死)
  def student():
  global name#这个作用是把 name定义为全局变量
  name='alex'
  
  student()
  print(name)
  为啥:容易混乱程序(找bug找死你)
  递归:(在函数内部可以调用自己)
  1.必须要有明确的结束条件
  2.每次进入更深一层的时候,问题规模应该比上一层要小
  3.递归效率不高,递归层次过多会导致栈溢出。(在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减少一层栈帧。由于栈的大小不是无限的,所以递归次数过多会导致栈溢出。)
  def calc(n):   #程序开始,取calc实参
  print(n)#打印判断结果
  if int(n/2) >0 :
  return calc(int(n/2)) #递归
  print('>>>',n)
  calc(10)
  运行结果:
  10
  5
  2
  1
  >>> 1
  函数式编程介绍:
  函数式编程是一种抽象程度很高的编程范式,纯粹的函数式编程语言的编写没有变量。因此,任意一个函数,只要输入确定的,输出就是确定的,这种纯函数我们称之为没有副作用。而允许使用变量的程序设计语言,由于函数内部的变量状态不确定,同样的输入,可能得到不同的输出,因此这种函数是有副作用的。
  函数式编程的一个特点就是,允许把函数本身作为参数传入另一个函数,还允许返回一个函数。
  Python对函数式编程提供部分支持,由于python允许使用变量,因此,python不是纯函数式编程语言。
  想学函数式编程可以学lisp、hashshell、erlang
  高阶函数:
  变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数就叫做高阶函数。
  def add(a,b,f):
  return f(a)+f(b)
  res=add(3,-6,abs)#abs 绝对值的意思
  print(res)
  结果:
  9
页: [1]
查看完整版本: 【12】Python函数学习(中)