PYTHON函数笔记

PYTHON函数笔记

欢迎使用 小书匠(xiaoshujiang)编辑器,您可以通过设置里的修改模板来改变新建文章的内容。

一、函数

定义:函数是指将一组语句的集合通过一个名字(函数名)封装起来,要想执行这个函数,只需调用其函数名即可

特性:
减少重复代码
使程序变得可扩展
使程序变得易维护

1.函数参数

def calc(x,y):   #xy 为形参
      res = x**y
      return res 

c = calc(a,b)   #ab 为实参
print(c)

举栗:

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

stu_register('小黄',22,'CN','student')
stu_register('小吴',23,'CN','student')
stu_register('小叶',23,'CN','student')

2.关键参数

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

stu_register('小叶',age=23,country='CN',course='student') #正确调用方法

3.非固定参数
若你的函数再定义时不确定用户想传入多少个参数,就可以使用非固定参数

def stu_register(name,age,*args): #args会把传入参数变成一个元组形式
      print(name,age,args)
stu_register('huang',22)
#输出 huang 22 () args为() 没有值所以为空

stu_register('huang',22,'CN','python')
#输出 huang 22 ('CN','python')

非固定关键字参数

def stu_register(name,age,*args,**kwargs): #kwargs会把多传入的参数变成一个dict形式
print(name,age,args,kwargs)

 stu_register('huang',22)
 #输出 huang 22 () {}
 
  stu_register('huang',22,'CN','python',sex='male',province='fujian')
  #输出 huang 22 ('CN','python') {'province':'fujian','sex':'male’}

4.函数返回值

def stu_register(name,age,country='CN',course='PY'):
          print('----学生信息----')
          print('姓名',name)
          print('age',age)
          print('国籍',country)
          print('课程',course)
          if age > 22:
                return Flase
          else:
                return True
registriation_status = stu_register('小黄',22,course='PY全栈',country=‘JP'
if registriation_status:
    print('注册成功')
else:
    print('太老了')

注意:
函数再执行过程中遇到return就停止执行并返回结果
如果未再函数中指定return,那这个函数的返回值为none

5.嵌套函数

def func1():
      print('alex')
      def func2():
            print('eric')
      func2()
func1()

输出alex eric

6.匿名函数

def calc(x,y):
      if x < y :
            return x*y
      else:
            return x/y
    
func = lambda x,y : x*y if x<y else x/y #声明一个匿名函数
print(calc(16,8))  
print(func(16,8))

输出结果都为2,匿名函数最复杂只能支持三元运算

7.高阶函数
函数的参数能接受变量,那么一个函数就可以接收另一个函数作为参数,称为高阶函数
满足以下条件
1)接受一个或多个函数作为输入
2)return返回另一个函数

def func(x,y) :
      return x+y
def calc(x) :
      return x
f = calc(func)
print(f(5,9))  #输出14,把func传进了函数

8.递归
再函数内部,可以调用其他函数。如果函数再内部调用自身本身,就是递归函数

def recursion(n) :
      print(n)
      recursion(n+1)
recursion(1)  #结果输出1-999 

栗子:传入一个10,让它每次除2,不要小数,到0就停下来

def calc(n) :
      v = int(n/2)
      print(v)
      if v == 0 :
           return ‘结束'
      calc(v)
 calc(10)   #输出5210

递归的特性总结:
1)必须有一个明确的结束条件
2)每进入更深一层递归时,问题规模相比上次减少
3)递归效率不高,递归层次过多会导致栈溢出

尾递归:

def cal(n):
      print(n)
      return cal(n+1)  #尾递归
cal(1)   #输出1-999 报错

四、函数进阶

1.名称空间
又名name space,救是存放名字的地方。若变量x=1,1存放于内存中,是存放名字x与1绑定。

名称空间有三种:
1)locals:函数内的名称空间,包括局部变量和形参

  1. globals:全局变量,函数定义所在模块

  2. builtins:内置模块的名字空间

不同变量的作用域不同就是由这个变量所在的命名空间决定的,查看作用域用locals globals

2.闭包

def func() :
      n = 10
      def func2():
            print('func2:' ,n )
      return func2
 
 f = func()
 print(f)
 f()

再函数里套用一层子函数,子函数被返回内存地址,再外层引用子函数,子函数又外层函数的变量

3.装饰器
栗子1:

def login(func):
print(func) #func==1    

def aaa(x,y):   #aaa=2
    print(x-y)
    print(x*y)
    func(x,y)
return aaa    #2

@login  #add=login(add)  #定义一个变量add接收login(add)执行后的结果
def add(x,y):             #add=1
    print(x+y)

add(3,1)
print(add)       

栗子2:

user_status = False
def login(func):
    def inner (*args,**kwargs):
        _username = 'alex'
        _password = '123'
        global user_status
        if user_status == False:
            username = input('user:')
            password = input('password')
            if username == _username and password == _password:
                print('welcome login...')
                user_status = True
            else:
                print('wrong username or wrong password')
        else:
            print('用户已登陆,验证通过')
        if user_status:
            func(*args,**kwargs)
    return inner

def home():
    print('首页')
def america():
    print('欧美')
@login
def japan():
    print('日韩')
@login
def C(style):
    print('国产',style)

C('abc')

4.列表生成式

a = [i+1 for i in range(10)]
print(a)

这样就是一个列表生成式
可以加入三元运算得到自己想要的结果

a = [i if i<5 else i*i for i in range(10)]
print(a)  #输出[0, 1, 2, 3, 4, 25, 36, 49, 64, 81]

5.生成器generator
要创建一个generator,只需要把列表生成式[]改成()
特性:
1.只能一直往前生成
2.有序生成
3.备料多少生成多少,超过报错

6.斐波那契数列
除第一个和第二个数外,任意一个数都是它的前两个数相加,用函数执行如下

def fib(max):
      n,a,b = 0,0,1
      while n < max:
          print(b)
          a,b = b, a+b
          n = n+1
      return 'done'
fib(10) 

变成生成器:

def fib(max):
      n,a,b = 0,0,1
      while n < max:
          yield b   #把函数的执行过程冻结在这一步,并且把b的值返回给外面的next
          a,b = b, a+b
          n = n+1
      return 'done'
f = fib(10)
print(next(f))  #生成器开始走

7.生成器send

def range(n):
      count = 0
      while count < n:
          print('count',count)
          count += 1
          sign = yield count
          print('--sign',sign)
      return 22
f = range(3)
print(next(f))
f.send('stop')  #输出count0,1,---sign stop

1.next可以唤醒并继续执行
2.send可以唤醒并继续执行且发送一个信息到生成器内部

8.迭代器
1.凡是可作用于for循环的对象都是Iterable可迭代(循环)类型
2.凡是可作用于next()函数的对象都是Iterable类型,它们表示一个惰性计算的序列
3.集合数据类型(list,dict,str...)是可迭代但不是迭代器,不过可以通过iter()函数变成迭代器、

posted @ 2019-07-06 15:38  飞翔的范佩西  阅读(138)  评论(0编辑  收藏  举报