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

  1. def sayhi(name):
  2. print("Hello, %s, I', nobody " % name)
  3.  
  4. print(sayhi) # 函数内存地址
  5. sayhi('Aldx') # 执行这个函数
  1. 参数
    形参和实参必须是一一对应的
  2.  
  3. 默认参数
    默认参数必须放到最后面。这只为了避免歧义,假设你传了三个参数,country='CN'在第三个,那么解释器就分不清楚你传给谁了,所以为了不影响位置参数,强制默认参数放在最后。
  1. def stu_register(name, age, course, country='CN'): # 形参,相当于占位,用完后内存会自动释放。
  2. print('resiger infomation......')
  3. print(name, age, country, course)
  4.  
  5. stu_register('Alex', 22, 'python') # 实参,必须是字符串、列表、数字、字典、元组等数据类型。
  1. 关键字参数
    关键字参数可以不按顺序。但关键字参数有一个要求就是必须放在位置参数(以位置顺序确定对应关系的参数)之后。
  1. def stu_register(name, age, course, country='CN'):
  2. print('resiger infomation......')
  3. print(name, age, country, course)
  4.  
  5. stu_register('王山炮', country='PY', age=22, course='Go语言')
  6.  
  7. # 错误示例
  8. stu_register('网山炮', country='PY', 22, course='Go语言') # 关键字参数不能放在默认参数前面
  9. stu_register('王山炮', 22, age=25, course='Go语言') # 不能给一个参数同时接受两个值
  1. 非固定参数
  1. 元组形式
  2. def send_alert(msg, *users):
  3. for u in users:
  4. print('报警发送给%s,%s' % (u, msg))
  5.  
  6. '''如果参数中出现*(*users),传递的参数就可以不再是固定个数,传递过来的所有参数都会被打包成元组,发送给users。用users有些非主流,主流用法(专业用法)是写成*args '''
  7. # 方式一
  8. send_alert('内存占用率达到90%', 'alex', 'jack', 'ann', 'wusir')
  9.  
  10. # 方式二(错误的)
  11. send_alert('内存占用率达到90%', ['alex', 'jack', 'ann', 'wusir']) # 相当于这样了(['alex', 'jack', 'ann', 'wusir']),循环出来就一个值,是一个列表。
  12.  
  13. # 方式三(和方式一的效果一样)
  14. send_alert('内存占用率达到90%', *['alex', 'jack', 'ann', 'wusir'])
  15.  
  16. # 错误示例:
  17. def send_alert(msg, *args, age):
  18. for u in args:
  19. print('报警发送给%s,%s' % (u, msg))
  20.  
  21. # send_alert('alex', 'rain', 22) # 因为把值都给了users了,age没有值了.
  22. # 正确的方法
  23. send_alert('alex', 'rain', 'snow', age=22) # age不能放在*args前面
  1. def area(name, *args):
    print(args) # (20, 10)
    print(*args) # 20 10 # 加*能消除元组
  2.  
  3. def rectangle(long, short):
    return long * short
  4.  
  5. def square(len_of_side):
    return len_of_side * len_of_side
  6.  
  7. def cycle(radis):
    return 3.14 * radis ** radis
  8.  
  9. if name == '圆形':
    return cycle(*args)
    elif name == '正方形':
    return square(*args)
    elif name == '长方形':
    return rectangle(*args)
    else:
    print('输入非法')
  10.  
  11. a = area('长方形', 20, 10)
    print(a)
  1. dic = {"k1:": "v1v1", "k2": [11, 22, 33, 44]}
  2.  
  3. def check_length(*args, **kwargs):
    print(kwargs)
    dic = {}
    for key in kwargs:
    if len(kwargs[key]) > 2:
    kwargs[key] = kwargs[key][0:2]
    dic[key] = kwargs[key]
    return dic
  4.  
  5. dic2 = check_length(**dic) # 传入dic就是一个空字典
  1. 字典形式
  1. def func(name, *args,):
  2. print(name, args)
  3.  
  4. func('Alex', 22, 'tesla', '500w', addr='山东', num=1232131) # 报错
  5.  
  6. def func(name, *args, **kwargs):
  7. print(name, args, kwargs)
  8.  
  9. d = {'degree': 'primary school'}
  10. # func('Alex', 22, 'tesla', '500w', addr='山东', num=1232131) # Alex (22, 'tesla', '500w') {'addr': '山东', 'num': 1232131}
  11. func('wusir', d) # wusir ({'degree': 'primary school'},) {} # 传到args里面了
  12. func('wusir', **d) # wusir () {'degree': 'primary school'}
  1. 函数返回值
    默认是返回Nonereturn代表一个函数的终止,一遇到return,函数就结束了,后面的就不执行了。
  1. def stu_register(name, age, course, country='CN'):
  2. print('-----注册学生信息-----')
  3. print('姓名:', name)
  4. print('年龄:', age)
  5. print("国籍:", country)
  6. print('课程:', course)
  7.  
  8. # 函数永远只返回一个值
  9. # return name, age # ('王山炮', 22)
  10. # return [name,age] # ['王山炮', 22]
  11. # return {name, age} # {'王山炮', 22}
  12.  
  13. if age > 22:
  14. return False # 任何东西都可以返回,返回的要是外面想要拿到的结果。
  15. else:
  16. return True
  17.  
  18. registriation_status = stu_register('王山炮', 22, course='python后台开发', country='JP')
  19.  
  20. if registriation_status:
  21. print('\n注册成功')
  22. else:
  23. print('\n年龄太大')
  24. print(registriation_status)
  1. 全局变量和局部变量
  1. name = 'Black girl'
  2.  
  3. def change_name():
  4. # print(name) # 'Black girl' # 没有局部变量就调用全局的,有局部变量会先调用局部变量
  5.  
  6. name = '黑色的姑娘'
  7. print("在", name, "里面......", id(name))
  8.  
  9. def func2():
  10. name = 'rain'
  11.  
  12. change_name() # 在 黑色的姑娘 里面...... 4327858536
  13. print(name, id(name)) # Black girl 4327737776
  1. 在函数里面改全局变量(在实际开发中不建议使用,不好调试)
  1. name = 'Black girl'
  2.  
  3. def change_name():
  4. global name # 先声明修改的全局变量,在修改
  5. name = '黑色的姑娘'
  6. age = 25
  7. print("在", name, "里面......", id(name))
  8.  
  9. change_name() # 在 黑色的姑娘 里面...... 4327858536
  10. print(name, id(name)) # 黑色的姑娘 4327858536
  1. 在函数里修改列表数据
    字典、列表、对象是可以被修改的
  1. names = ['Alex', 'Black Girl', 'Peiqi']
  2.  
  3. def change_name():
  4. # names = ['aa', 'bb', 'cc'] # 无法修改全局的names
  5.  
  6. del names[2]
  7. names[1] = '黑姑娘'
  8. print(names)
  9.  
  10. change_name() # ['Alex', '黑姑娘']
  11. print(names) # ['Alex', '黑姑娘']

在函数里调用names只是调用了其整体的内存地址,里面元素的内存地址和整体是不一样的,所以里面元素可以修改,给这个列表整体赋值是不可以的。

  1. 嵌套函数
  1. 1
  2. def func1():
  3. print('alex')
  4.  
  5. def func2():
  6. print('eric')
  7.  
  8. func2()
  9.  
  10. # 1.函数内部可以再次定义函数
  11. # 2.执行需要被调用
  12.  
  13. 2
  14. age = 19
  15.  
  16. def func1():
  17. def func2():
  18. print(age)
  19.  
  20. age = 73
  21. func2()
  22.  
  23. func1() #
  24. age = 73 func1内,执行的时候func2中的print(age)会先从func1里找,所以print出的是73
  25.  
  26. 3
  27.  
  28. age = 19
  29.  
  30. def func1():
  31. def func2():
  32. print(age)
  33.  
  34. func2()
  35. age = 73
  36.  
  37. func1() # 报错
  38. # 原因是因为在执行print(age)的时候,它会往上找,本来会找age = 19,但是下面(func2()下面)还有一个age = 73,所以它就会不知道找哪个。
  39. # 解决方案:1.不写age = 73. 2.把age = 73写到func2()上面 3.在 def func2():上加上global age,这样age = 73把全局的age就给修改了。
  1. 作用域
    python中,一个函数就是一个作用域,和javascript一样,局部变量放置在其作用域中。
    C#,Java中的作用域是 {}
    定义完成后,作用域已经生成,作用域链向上查找
  1. age = 18
  2.  
  3. def func1():
  4. age = 73
  5.  
  6. def func2():
  7. print(age)
  8.  
  9. return func2 # 函数名可以当做返回值∂
  10.  
  11. val = func1()
  12. val() # 不管函数名在哪里,只要一执行,它永远回到它最开始的地方执行,从本函数开始往上找变量。
  1. 匿名函数
    一般和其他方法搭配使用,用完一次就不用了,所以没有必要给它起名。
  1. def calc(x, y):
  2. if x < y:
  3. return x * y
  4. else:
  5. return x / y
  6.  
  7. calc2 = lambda x, y: x * y if x < y else x / y # 声明一个匿名函数,只能支持到三元运算,不支持复杂的语句。
  8. print(calc(16, 8)) # 2.0
  9. print(calc2(16, 8)) # 2.0
  10.  
  11. data = list(range(10))
  12. print(data)
  13.  
  14. times = map(lambda x: x * x, data)
  15. print(list(times)) # [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
  1. 高阶函数
    只需满足以下任意一个条件,即是高阶函数
    1.接收1个或多个函数作为输入
    2.return返回另外一个函数,比如返回abs,x,y
  1. def func(x, y):
  2. return x + y
  3.  
  4. def calc(x):
  5. return x
  6.  
  7. f = calc(func)
  8. print(f(3, 5)) #
  1.  
  1.  

python之函数基础总结的更多相关文章

  1. python 17 函数基础(一)

    http://www.cnblogs.com/BeginMan/p/3171977.html 一.什么是函数.方法.过程 推荐阅读:http://www.cnblogs.com/snandy/arch ...

  2. 【Python】函数基础简介

    一.函数 1. 简介 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段.函数能提高应用的模块性,和代码的重复利用率. 2. 组成 函数代码块以 def 关键词开头,后接函数名和圆括号( ...

  3. python,day3,函数基础-3

    本节内容 1. 函数基本语法及特性 2. 参数与局部变量 3. 返回值 嵌套函数 4.递归 5.匿名函数 6.函数式编程介绍 7.高阶函数 8.内置函数 1.函数基本语法及特性 函数是什么? 函数一词 ...

  4. Python的函数基础

    引子 现在老板让你写一个监控程序,24小时全年无休的监控你们公司网站服务器的系统状况,当cpu\memory\disk等指标的使用量超过阀值时即发邮件报警,你掏空了所有的知识量,写出了以下代码 whi ...

  5. python中函数基础

    函数 什么是函数? 函数分为内置函数和自定义函数 定义:在程序中具备某一功能的工具.在使用之前需准备该工具(函数的定义),遇到应用场景拿来就用(后引用). 为什么要用函数? 1.代码冗余 程序组织结构 ...

  6. Python之函数——基础篇

    函数 函数,在BASIC中,叫subroutine(子过程或子程序),在Pascal中叫做procedure(过程)和function,在C中只有function,在Java中叫method. 定义: ...

  7. python 新手函数基础(函数定义调用值传递等)

    1.编程的集中主要方式: 面向过程 >类 >>关键字class 面向函数>函数 >> 关键字def 面向过程> 过程 >> 关键字def 2.py ...

  8. python 之 函数 基础2

    5.36 命名关键字 什么是命名关键字参数? 格式:在*后面参数都是命名关键字参数 特点: 1 必须被传值 2 约束函数的调用者必须按照key=value的形式传值 3 约束函数的调用者必须用我们指定 ...

  9. Python:函数基础

    概念 一段代码,集中到一起,起一个名字,下一次可以使用这个名字调用这个代码块,就是函数的功能 作用: 方便代码的重用 分解任务,简化程序逻辑 使代码更加模块化 函数的分类 内建函数 第三方函数 自定义 ...

随机推荐

  1. High waits on control file sequential read

    High waits on control file sequential read (文档 ID 2277867.1) In case we run into an issue where cont ...

  2. openstack安装newton版本Nova部署(三)

    一.控制节点安装部署Nova Nova 包含API(负责接收相应外部请求,支持OpenStackAPI,EC2API):cert:负责身份认证:schedule:用于云主机调度(虚拟机创建在哪台主机上 ...

  3. 基于spring-boot和docker-java实现对docker容器的动态管理和监控[附完整源码下载]

    ​ (我是个封面) docker简介 Docker 是一个开源的应用容器引擎,和传统的虚拟机技术相比,Docker 容器性能开销极低,因此也广受开发者喜爱.随着基于docker的开发者越来越多,doc ...

  4. logback整合Logstash

    1.依赖 <dependency> <groupId>net.logstash.logback</groupId> <artifactId>logsta ...

  5. Access denied for user ''@'localhost' (using password: NO)之idea坑~

    idea启动sql连接远程数据库时发生错误: 发现是sql连接配置问题: spring: datasource: data-username: root data-password: 123456 u ...

  6. AngularJS所有版本下载地址

    AngularJS官网本身采用AngularJS库构建,页面中的AngularJS库通过Google的CDN(内容分发网络)引入,所以国内访问会有问题. 大家可以从下面地址获取AngularJS所以版 ...

  7. python+selenium之处理HTML5的视频播放

    from selenium import webdriver from time import sleep driver = webdriver.Firefox() driver.get(" ...

  8. dataset datatable datacolums datarow

    DataSet 表示数据在内存中的缓存. 属性 Tables  获取包含在 DataSet 中的表的集合. ds.Tables["sjxx"] DataTable 表示内存中数据的 ...

  9. Web端 页面跳转 页面传值

    要把  Default.aspx 页面    TextBox1中的值    传值到   Default.aspx   Label上去 C#服务端跳转页面 Response    响应请求对象 Redi ...

  10. 发现知乎的一个Bug,并且我绕过了此Bug,沾沾自喜中...

    发现问题 在知乎点击修改头像,上传图片时发现一片空白.凭着程序员的直觉,第一反应时看下控制台是否有报错.果然发现如下: Refused to load the image 'data:image/jp ...