2019-03-14-day010-函数进阶
昨日回顾
1.函数:
函数的定义
函数的参数
- 位置参数
- 关键字参数
- 混合参数
- 形参的位置上(默认参数)
- 实参的位置上(关键字参数)
- 位置参数 > 默认参数
三元运算符:
c = a if a>b else b
函数的返回值:
- 没有写return 返回的是None
- 写了return 没写返回值也是None
- 写了一个值是它本身,多个返回的是一个元组
- return 下面的代码不执行
- 当函数执行到return就结束这个函数
返回值返回给调用者?? 函数名+() 就是调用者
传参: 将实参传递给形参的过程
函数执行流程:
- 定义函数
- 开辟内存
- 调用函数
- 执行函数体
- 销毁函数开辟的内存
li = [1,23]
def func(li):
print(li) #'啊啊啊'
func('啊啊啊')
def func(argv):
argv = 123
print(argv)
pass
func(123)
作业讲解:
7.写函数,检查传入字典的每一个value的长度,如果大于2,
那么仅保留前两个长度的内容,并将新内容返回给调用者。
dic = {"k1": "v1v1", "k2": [11,22,33,44]}
PS:字典中的value只能是字符串或列表
dic={"k1": "v1v1", "k2": [11, 22, 33, 44]}
def aaa(d):
for k,v in d.items():
if len(v) > 2:
d[k] = v[0:2]
return d
ret = aaa(dic)
print(ret)
print(dic)
import os
9.写函数,函数接收四个参数分别是:姓名,性别,年龄,学历。
用户通过输入这四个内容,然后将这四个内容传入到函数中,
此函数接收到这四个内容,将内容追加到一个student_msg文件中。
def s(name,sex,age,level): # 形参 接受
with open('student_msg','a',encoding='utf-8')as f:
f.write(f'{name},{sex},{age},{level}\n')
name = input('name:')
sex = input('sex:')
age = input('age:')
level = input('level:')
s(name,sex,age,level) # 实参 传入
格式化字符串方法
3种:
%
fromat
f
name = '粉葛'
a = f'{name},你好'
%s
s = '请输入内容:'
def s(name,sex,age,level): # 形参 接受
sex='男' if sex == '' else sex
with open('student_msg','a',encoding='utf-8')as f:
f.write(f'{name},{sex},{age},{level}\n')
def q(name): # 名字,性别,年龄
if name.upper() == 'Q':
exit()
flag = True
while flag:
name = input('name(Q/退出):')
q(name)
sex = input('sex(Q/退出)[男性直接回车]:')
q(sex)
age = input('age(Q/退出):')
q(age)
level = input('level(Q/退出):')
q(level)
s(name,sex,age,level) # 实参 传入
11.写函数,用户传入修改的文件名,
与要修改的内容,执行函数,完成整个文件的批量修改操作(升级题)。
def func(file_name,old,new):
with open(file_name,'r',encoding='utf-8')as f,\
open(f'new_{file_name}','w',encoding='utf-8')as f1:
for line in f:
line = line.replace(old,new)
f1.write(line)
os.remove(file_name)
os.rename(f'new_{file_name}',file_name,)
func('student_msg','sb','alex')
alt + 回车
动态参数
def func(): # 形参
pass
func() # 实参
def func(a,b,c,*args): # 在形参位置*叫做聚合
print(a,b,c)
print(args) # 元组形式
func(1,2,3,4,5,9,6,7,8)
位置参数 > 动态的位置参数
def func(**kwargs): # 动态默认参数 #形参的时候**聚合
print(kwargs) # 字典
func(a=1,b=2,c=3) # 关键字的形式传参
def func(a,b,c,*args,x=1,y=1,z=1,**kwargs):
print(a,b,c)
print(args,kwargs)
print(x, y, z)
# 1 2 3
# (1,2,3,4,5)
# 1 1 1
# {'a': 1, 'b': 1, 'c': 1}
func(1,2,3,4,e=1,f=2,g=3)
def func(a,b,c,*args,x=1,y=1,z=1,**kwargs):
print(a,b,c) # 123
print(args,kwargs) # () {}
print(x, y, z) #1 1 1
# 1 2 3
# (1,2,3,4,5)
# 1 1 1
# {'a': 1, 'b': 1, 'c': 1}
func(1,2,3,4,a=1,b=2,c=3)
def func(*args,**kwargs):
print(args,kwargs) # args = () kwargs = {}
func(1,2,3,a=4,b=5)
def func(*args,**kwargs):
print(args,kwargs) # args = () kwargs = {'a':4,'b':5}
func(a=4,b=5)
def func(*args,**kwargs):
print(args,kwargs) # args = (1,2,3) kwargs = {}
func(1,2,3)
def func(*args,**kwargs): # * 聚合
print(*args) # args = () *args = 1 2 3 *打散
print(*kwargs) # args = () **kwargs = 1 2 3 *打散 字典的键
func(1,2,3,a=4,b=5)
li = [1,2,3,5,4]
def func(*args): # 聚合 (1,2,3,5,4)
print(args)
print(*args) # 打散 1,2,3,5,4
func(*li) # 1,2,3,5,4
def func(*args,**kwargs): # 聚合 (1,2,3,5,4)
print(args,*kwargs) # print('a','b')
func(**dic) # 1,2,3,5,4
dic = {'a':1,'b':2}
def func(*args,**kwargs): # 聚合 (1,2,3,5,4)
print(args,*kwargs) # a=1,b=2
func(*[1,2,3]) # func(a=1,b=2)
print('a','b')
print(a=1,b=2)
li = [1,2,3,4]
args和 kwargs 是可以更换的,但是程序员约定都用它
用途:
- 在不明确接受参数,数量时使用*args和**kwargs
- 动态位置参数 > 动态关键字参数
- 形参: 位置 > 动态位置 > 默认参数 > 动态默认参数
- 实参: 位置 > 关键字参数
- 在实参调用的时候 *将可迭代的对象打散,字典是将键取出
- 在形参处出现*就是在聚合
- 在实参调用的时候 **将字典打散成 关键字参数(键=值)
- 在形参处出现**就是将关键字参数聚合成一个字典
def func(a,**kwargs):
print(a)
# **kwargs # a=1,b=2
b = **kwargs
func(**{'a':1}) # func(a=1)
函数的注释
def aaa(user,pwd):
"""
登录函数
:param user: 用户名
:param pwd: 密码
:return: 校验后的账号和密码
"""
print(111)
print(aaa.__doc__)
简单了解
print(aaa.__name__) # 反射
名称空间
- 内置空间中所有代码 -- 内置空间
- 自己写的py文件 -- 全局空间
- 函数中的代码 -- 局部空间
a = 10
def func():
print(a)
func()
加载顺序:
- 内置空间
- 全局空间
- 局部空间
取值顺序:
- 局部空间
- 全局空间
- 内置空间
- 找不到就报错
作用域:
- 全局作用域 内置+全局 = 全局作用域
- 局部作用域 函数内的就是局部作用域
a = 10
def func():
global a # (声明)我要修改a 找到要a
a+=1 # 修改
func()
print(a)
def func():
global a #(声明我要修改a,找不到a的时候在全局创建一个 a=0)
a = 1 # a = 1
func()
print(a)
```
##函数的嵌套
###第一种函数嵌套 在函数func内
```python
def func():
print(3)
def f():
print(1)
print(2)
f()
func()
第二种函数嵌套 多个函数嵌套调用
def func2():
print(1)
log()
def func1():
print(3)
def log():
func1()
print(6)
def fun():
print(7)
def func():
a = 1
def log():
a = 5
def info():
a = 10
print(a)
print(a)
print(a)
func()
def func():
a = 1
def log():
a = 5 # a = 15
def info():
nonlocal a # 声明修改log函数下边的变量a
a += 10 # a = a + 10 a = 15
print(a) # 15
info()
print(a) # 15
log()
print(a) # 1
func()
在一个局部空间内,nonlocal会修改离他最近的那个变量,如果上一层
没有就继续向上找,直到走到局部空间头部
def f():
def a1():
def l():
nonlocal a
a = 8
print(a)
l()
print(a1())
f()
global : 在局部修改全部变量,如果没有就创建一个新的
nonlocal : 在局部空间内,修改离自己最近的变量,如果上一层没有就继续向上找,
直到找到局部变量的顶层,局部空间内没有可以修改的变量,就报错
今日总结
函数的进阶:
1.1 动态参数
位置参数 > 动态位置参数 > 默认参数 > 动态(关键字)默认参数
1.2 ,*
在实参位置是打散
在形参位置是聚合
1.3 args,*kwargs 可以修改,但是不建议修改
1.4 将(列表,元组,字符串,字典,集合)打散传入
2.1 函数的注释:
""" """ 官方推荐
查看注释: func名.__doc__
查看注释: func名.__name__
3.1 名称空间
加载顺序:
1.内置空间
2.全局空间
3.局部空间
取值顺序:
1.局部空间
2.全局空间
3.内置空间
作用域;
全局作用域 内置 + 全局
局部作用域 局部
global : 在局部修改全部变量,如果没有就创建一个新的
nonlocal : 在局部空间内,修改离自己最近的变量,如果上一层没有就继续向上找,
直到找到局部变量的顶层,局部空间内没有可以修改的变量,就报错
4.1 函数的嵌套
函数的嵌套-》一个套一个,两个套三个
4.2:函数嵌套内,从最里层返回一个任意字符串,在外部接受打印
2019-03-14-day010-函数进阶的更多相关文章
- 2019.03.14 ZJOI2019模拟赛 解题报告
得分: \(100+100+0=200\)(\(T1\)在最后\(2\)分钟写了出来,\(T2\)在最后\(10\)分钟写了出来,反而\(T3\)写了\(4\)个小时爆\(0\)) \(T1\):风王 ...
- python函数进阶(函数参数、返回值、递归函数)
函数进阶 目标 函数参数和返回值的作用 函数的返回值 进阶 函数的参数 进阶 递归函数 01. 函数参数和返回值的作用 函数根据 有没有参数 以及 有没有返回值,可以 相互组合,一共有 4 种 组合形 ...
- python大法好——递归、内置函数、函数进阶
1.递归(自己干自己) def fun(n): n=n/2 print(n) if(n>2) fun(n) #函数调用 fun(10) 结果是5 2 1 0 递归的执行过程:递归执行到最里面一层 ...
- 【转】Python之函数进阶
[转]Python之函数进阶 本节内容 上一篇中介绍了Python中函数的定义.函数的调用.函数的参数以及变量的作用域等内容,现在来说下函数的一些高级特性: 递归函数 嵌套函数与闭包 匿名函数 高阶函 ...
- python学习笔记:第10天 函数进阶和作用域
目录 1. 函数进阶 2. 命名空间 3. 关键字global和nonlocal 1. 函数进阶 动态接收位置参数 之前写的函数都是固定参数的,假设有个函数需要的参数由几十个,一个个写在形参的位置会非 ...
- No-12.函数进阶
函数进阶 目标 函数参数和返回值的作用 函数的返回值 进阶 函数的参数 进阶 递归函数 01. 函数参数和返回值的作用 函数根据 有没有参数 以及 有没有返回值,可以 相互组合,一共有 4 种 组合形 ...
- Python之函数进阶
本节内容 上一篇中介绍了Python中函数的定义.函数的调用.函数的参数以及变量的作用域等内容,现在来说下函数的一些高级特性: 递归函数 嵌套函数与闭包 匿名函数 高阶函数 内置函数 总结 一.递归函 ...
- 深入理解javascript函数进阶系列第一篇——高阶函数
前面的话 前面的函数系列中介绍了函数的基础用法.从本文开始,将介绍javascript函数进阶系列,本文将详细介绍高阶函数 定义 高阶函数(higher-order function)指操作函数的函数 ...
- [2019.03.25]Linux中的查找
TMUX天下第一 全世界所有用CLI Linux的人都应该用TMUX,我爱它! ======================== 以下是正文 ======================== Linu ...
- 【python 3】 函数 进阶
函数进阶 1.函数命名空间和作用域 命名空间一共分为三种: 全局命名空间 局部命名空间 内置命名空间 *内置命名空间中存放了python解释器为我们提供的名字:input , print , str ...
随机推荐
- python记录_day15 面向对象初识
一.面向过程和面向对象 1.面向过程 以我为中心,做一件事先干什么,在干什么,后干什么,有一套清楚完整的流程.核心是“过程”. 优点:将要解决的问题流程化, 编写相对简单 缺点:可扩展性差 2.面向对 ...
- 『MXNet』im2rec脚本使用以及数据读取
一.im2rec用法简介 首先看文档: usage: im2rec.py [-h] [--list] [--exts EXTS [EXTS ...]] [--chunks CHUNKS] [--tra ...
- MSMQ 概述
MSMQ 概述 1) MSMQ概述 MSMQ 表示微软消息队列服务.MSMQ 可以工作在在线或者离线场景,并提供异步编程功能.如果客户端离线,MSMQ将会是最合适的方法,这是因为服务端不需要等待客户端 ...
- PostgreSQL&PostGIS完全安装
检查PostGIS.PostgreSQL.GEOS.GDAL.PROJ等各软件的版本依赖关系 http://trac.osgeo.org/postgis/wiki/UsersWikiPostgreSQ ...
- python使用MySQLdb模块连接MySQL
1.安装驱动 目前有两个MySQL的驱动,我们可以选择其中一个进行安装: MySQL-python:是封装了MySQL C驱动的Python驱动:mysql-connector-python:是MyS ...
- CentOS查看安装包会释放哪些文件
1.查看软件包全称(以mysql为例) rpm -qa | grep -i mysql 2.查看释放出的文件(以MySQL-server-5.5.55-1.el6.x86_64为例) rpm -ql ...
- 在vue项目中使用sass
如果想开发移动端项目,那么适配的时候sass必不可缺,但是 npm 安装sass时候总是报错失败! 研究半天发现可以解决的方法,亲测有效 1.先换成淘宝镜像再安装 npm install -g cn ...
- CAD(镜像对象)(镜像后的微调)(门窗标注)5.14
由于绘制的cad图形整体是对称的,所以先画了一半,然后再镜像过去.沿着某一对称轴. 注意:1.有些三维内容在二维是选择不上的.2.对称轴上的柱子和墙体之类的不能选中.把轴网和标注的图层锁起来.冻结起来 ...
- python全栈开发笔记---------变量小结
变量是什么? 变:变化,重在变字,量:计量,衡量,表示一种状态. 变量字面理解就是一个可能改变的量,也就是这个值是不固定的. 变量名: a.数字 b.字母 c.下划线 变量的定义 level = 1 ...
- TiDB 深度实践之旅--真实“踩坑”经历
美团点评 TiDB 深度实践之旅(9000 字长文 / 真实“踩坑”经历) 4 PingCAP · 154 天前 · 3956 次点击 这是一个创建于 154 天前的主题,其中的信息可能已经有所发 ...