python之函数基础总结
定义:函数是指将一组语句的集合通过一个名字(函数名)封装起来,要想执行这个函数,只需调用其函数名即可。
- def sayhi(name):
- print("Hello, %s, I', nobody " % name)
- print(sayhi) # 函数内存地址
- sayhi('Aldx') # 执行这个函数
- 参数
形参和实参必须是一一对应的- 默认参数
默认参数必须放到最后面。这只为了避免歧义,假设你传了三个参数,country='CN'在第三个,那么解释器就分不清楚你传给谁了,所以为了不影响位置参数,强制默认参数放在最后。
- def stu_register(name, age, course, country='CN'): # 形参,相当于占位,用完后内存会自动释放。
- print('resiger infomation......')
- print(name, age, country, course)
- stu_register('Alex', 22, 'python') # 实参,必须是字符串、列表、数字、字典、元组等数据类型。
- 关键字参数
关键字参数可以不按顺序。但关键字参数有一个要求就是必须放在位置参数(以位置顺序确定对应关系的参数)之后。
- def stu_register(name, age, course, country='CN'):
- print('resiger infomation......')
- print(name, age, country, course)
- stu_register('王山炮', country='PY', age=22, course='Go语言')
- # 错误示例
- stu_register('网山炮', country='PY', 22, course='Go语言') # 关键字参数不能放在默认参数前面
- stu_register('王山炮', 22, age=25, course='Go语言') # 不能给一个参数同时接受两个值
- 非固定参数
- 元组形式
- def send_alert(msg, *users):
- for u in users:
- print('报警发送给%s,%s' % (u, msg))
- '''如果参数中出现*(*users),传递的参数就可以不再是固定个数,传递过来的所有参数都会被打包成元组,发送给users。用users有些非主流,主流用法(专业用法)是写成*args '''
- # 方式一
- send_alert('内存占用率达到90%', 'alex', 'jack', 'ann', 'wusir')
- # 方式二(错误的)
- send_alert('内存占用率达到90%', ['alex', 'jack', 'ann', 'wusir']) # 相当于这样了(['alex', 'jack', 'ann', 'wusir']),循环出来就一个值,是一个列表。
- # 方式三(和方式一的效果一样)
- send_alert('内存占用率达到90%', *['alex', 'jack', 'ann', 'wusir'])
- # 错误示例:
- def send_alert(msg, *args, age):
- for u in args:
- print('报警发送给%s,%s' % (u, msg))
- # send_alert('alex', 'rain', 22) # 因为把值都给了users了,age没有值了.
- # 正确的方法
- send_alert('alex', 'rain', 'snow', age=22) # age不能放在*args前面
- def area(name, *args):
print(args) # (20, 10)
print(*args) # 20 10 # 加*能消除元组- def rectangle(long, short):
return long * short- def square(len_of_side):
return len_of_side * len_of_side- def cycle(radis):
return 3.14 * radis ** radis- if name == '圆形':
return cycle(*args)
elif name == '正方形':
return square(*args)
elif name == '长方形':
return rectangle(*args)
else:
print('输入非法')- a = area('长方形', 20, 10)
print(a)
- dic = {"k1:": "v1v1", "k2": [11, 22, 33, 44]}
- 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- dic2 = check_length(**dic) # 传入dic就是一个空字典
- 字典形式
- def func(name, *args,):
- print(name, args)
- func('Alex', 22, 'tesla', '500w', addr='山东', num=1232131) # 报错
- def func(name, *args, **kwargs):
- print(name, args, kwargs)
- d = {'degree': 'primary school'}
- # func('Alex', 22, 'tesla', '500w', addr='山东', num=1232131) # Alex (22, 'tesla', '500w') {'addr': '山东', 'num': 1232131}
- func('wusir', d) # wusir ({'degree': 'primary school'},) {} # 传到args里面了
- func('wusir', **d) # wusir () {'degree': 'primary school'}
- 函数返回值
默认是返回None。return代表一个函数的终止,一遇到return,函数就结束了,后面的就不执行了。
- def stu_register(name, age, course, country='CN'):
- print('-----注册学生信息-----')
- print('姓名:', name)
- print('年龄:', age)
- print("国籍:", country)
- print('课程:', course)
- # 函数永远只返回一个值
- # return name, age # ('王山炮', 22)
- # return [name,age] # ['王山炮', 22]
- # return {name, age} # {'王山炮', 22}
- if age > 22:
- return False # 任何东西都可以返回,返回的要是外面想要拿到的结果。
- else:
- return True
- registriation_status = stu_register('王山炮', 22, course='python后台开发', country='JP')
- if registriation_status:
- print('\n注册成功')
- else:
- print('\n年龄太大')
- print(registriation_status)
- 全局变量和局部变量
- name = 'Black girl'
- def change_name():
- # print(name) # 'Black girl' # 没有局部变量就调用全局的,有局部变量会先调用局部变量
- name = '黑色的姑娘'
- print("在", name, "里面......", id(name))
- def func2():
- name = 'rain'
- change_name() # 在 黑色的姑娘 里面...... 4327858536
- print(name, id(name)) # Black girl 4327737776
- 在函数里面改全局变量(在实际开发中不建议使用,不好调试)
- name = 'Black girl'
- def change_name():
- global name # 先声明修改的全局变量,在修改
- name = '黑色的姑娘'
- age = 25
- print("在", name, "里面......", id(name))
- change_name() # 在 黑色的姑娘 里面...... 4327858536
- print(name, id(name)) # 黑色的姑娘 4327858536
- 在函数里修改列表数据
字典、列表、对象是可以被修改的
- names = ['Alex', 'Black Girl', 'Peiqi']
- def change_name():
- # names = ['aa', 'bb', 'cc'] # 无法修改全局的names
- del names[2]
- names[1] = '黑姑娘'
- print(names)
- change_name() # ['Alex', '黑姑娘']
- print(names) # ['Alex', '黑姑娘']
在函数里调用names只是调用了其整体的内存地址,里面元素的内存地址和整体是不一样的,所以里面元素可以修改,给这个列表整体赋值是不可以的。
- 嵌套函数
- 例1
- def func1():
- print('alex')
- def func2():
- print('eric')
- func2()
- # 1.函数内部可以再次定义函数
- # 2.执行需要被调用
- 例2
- age = 19
- def func1():
- def func2():
- print(age)
- age = 73
- func2()
- func1() #
- age = 73 在func1内,执行的时候func2中的print(age)会先从func1里找,所以print出的是73
- 例3
- age = 19
- def func1():
- def func2():
- print(age)
- func2()
- age = 73
- func1() # 报错
- # 原因是因为在执行print(age)的时候,它会往上找,本来会找age = 19,但是下面(func2()下面)还有一个age = 73,所以它就会不知道找哪个。
- # 解决方案:1.不写age = 73. 2.把age = 73写到func2()上面 3.在 def func2():上加上global age,这样age = 73把全局的age就给修改了。
- 作用域
在python中,一个函数就是一个作用域,和javascript一样,局部变量放置在其作用域中。
C#,Java中的作用域是 {}
定义完成后,作用域已经生成,作用域链向上查找
- age = 18
- def func1():
- age = 73
- def func2():
- print(age)
- return func2 # 函数名可以当做返回值∂
- val = func1()
- val() # 不管函数名在哪里,只要一执行,它永远回到它最开始的地方执行,从本函数开始往上找变量。
- 匿名函数
一般和其他方法搭配使用,用完一次就不用了,所以没有必要给它起名。
- def calc(x, y):
- if x < y:
- return x * y
- else:
- return x / y
- calc2 = lambda x, y: x * y if x < y else x / y # 声明一个匿名函数,只能支持到三元运算,不支持复杂的语句。
- print(calc(16, 8)) # 2.0
- print(calc2(16, 8)) # 2.0
- data = list(range(10))
- print(data)
- times = map(lambda x: x * x, data)
- print(list(times)) # [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
- 高阶函数
只需满足以下任意一个条件,即是高阶函数
1.接收1个或多个函数作为输入
2.return返回另外一个函数,比如返回abs,x,y
- def func(x, y):
- return x + y
- def calc(x):
- return x
- f = calc(func)
- print(f(3, 5)) #
python之函数基础总结的更多相关文章
- python 17 函数基础(一)
http://www.cnblogs.com/BeginMan/p/3171977.html 一.什么是函数.方法.过程 推荐阅读:http://www.cnblogs.com/snandy/arch ...
- 【Python】函数基础简介
一.函数 1. 简介 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段.函数能提高应用的模块性,和代码的重复利用率. 2. 组成 函数代码块以 def 关键词开头,后接函数名和圆括号( ...
- python,day3,函数基础-3
本节内容 1. 函数基本语法及特性 2. 参数与局部变量 3. 返回值 嵌套函数 4.递归 5.匿名函数 6.函数式编程介绍 7.高阶函数 8.内置函数 1.函数基本语法及特性 函数是什么? 函数一词 ...
- Python的函数基础
引子 现在老板让你写一个监控程序,24小时全年无休的监控你们公司网站服务器的系统状况,当cpu\memory\disk等指标的使用量超过阀值时即发邮件报警,你掏空了所有的知识量,写出了以下代码 whi ...
- python中函数基础
函数 什么是函数? 函数分为内置函数和自定义函数 定义:在程序中具备某一功能的工具.在使用之前需准备该工具(函数的定义),遇到应用场景拿来就用(后引用). 为什么要用函数? 1.代码冗余 程序组织结构 ...
- Python之函数——基础篇
函数 函数,在BASIC中,叫subroutine(子过程或子程序),在Pascal中叫做procedure(过程)和function,在C中只有function,在Java中叫method. 定义: ...
- python 新手函数基础(函数定义调用值传递等)
1.编程的集中主要方式: 面向过程 >类 >>关键字class 面向函数>函数 >> 关键字def 面向过程> 过程 >> 关键字def 2.py ...
- python 之 函数 基础2
5.36 命名关键字 什么是命名关键字参数? 格式:在*后面参数都是命名关键字参数 特点: 1 必须被传值 2 约束函数的调用者必须按照key=value的形式传值 3 约束函数的调用者必须用我们指定 ...
- Python:函数基础
概念 一段代码,集中到一起,起一个名字,下一次可以使用这个名字调用这个代码块,就是函数的功能 作用: 方便代码的重用 分解任务,简化程序逻辑 使代码更加模块化 函数的分类 内建函数 第三方函数 自定义 ...
随机推荐
- 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 ...
- openstack安装newton版本Nova部署(三)
一.控制节点安装部署Nova Nova 包含API(负责接收相应外部请求,支持OpenStackAPI,EC2API):cert:负责身份认证:schedule:用于云主机调度(虚拟机创建在哪台主机上 ...
- 基于spring-boot和docker-java实现对docker容器的动态管理和监控[附完整源码下载]
(我是个封面) docker简介 Docker 是一个开源的应用容器引擎,和传统的虚拟机技术相比,Docker 容器性能开销极低,因此也广受开发者喜爱.随着基于docker的开发者越来越多,doc ...
- logback整合Logstash
1.依赖 <dependency> <groupId>net.logstash.logback</groupId> <artifactId>logsta ...
- Access denied for user ''@'localhost' (using password: NO)之idea坑~
idea启动sql连接远程数据库时发生错误: 发现是sql连接配置问题: spring: datasource: data-username: root data-password: 123456 u ...
- AngularJS所有版本下载地址
AngularJS官网本身采用AngularJS库构建,页面中的AngularJS库通过Google的CDN(内容分发网络)引入,所以国内访问会有问题. 大家可以从下面地址获取AngularJS所以版 ...
- python+selenium之处理HTML5的视频播放
from selenium import webdriver from time import sleep driver = webdriver.Firefox() driver.get(" ...
- dataset datatable datacolums datarow
DataSet 表示数据在内存中的缓存. 属性 Tables 获取包含在 DataSet 中的表的集合. ds.Tables["sjxx"] DataTable 表示内存中数据的 ...
- Web端 页面跳转 页面传值
要把 Default.aspx 页面 TextBox1中的值 传值到 Default.aspx Label上去 C#服务端跳转页面 Response 响应请求对象 Redi ...
- 发现知乎的一个Bug,并且我绕过了此Bug,沾沾自喜中...
发现问题 在知乎点击修改头像,上传图片时发现一片空白.凭着程序员的直觉,第一反应时看下控制台是否有报错.果然发现如下: Refused to load the image 'data:image/jp ...