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 ...
随机推荐
- 并查集 牛客练习赛41 C抓捕盗窃犯
题目链接 :https://ac.nowcoder.com/acm/contest/373/C 题意,初始每一个城市都有一伙盗贼,没过一个时刻盗贼就会逃窜到另一个城市,你可以在m个城市设置监察站,会逮 ...
- xShell的简单操作记录
查看java进程: ps ux | grep java 显示当前所有java进程pid的命令:jps 将压缩文件从本地上传到服务器上:rz 打包成jar包:mvn clean package -Dma ...
- 【IDEA】【7】Git更新及提交
如果是Git管理的项目,顶部会出现这样的按钮 绿色代表commit到本地 蓝色代表update最新代码 Push:推送到远程服务器:右键项目->Git->Repository->Pu ...
- 关于POD和非POD类型中,list initialization和constructor initialization(未解决)
如果你的成员是POD类型的,那么list initialization和constructor initialization没有任何区别 #include<iostream> using ...
- ubuntu server 启用mysql日志
1.要启动mysql日志,你就要找到mysql 核心的文件my.cnf (路径:/etc/mysql) 在命令窗口输入:cd /etc/mysql 在命令窗口输入:ls 你就可以看到my.cnf文件 ...
- 数据结构与算法之PHP实现队列、栈
一.队列 1)队列(Queue)是一种先进先出(FIFO)的线性表,它只允许在表的前端进行删除操作,在表的后端进行插入操作,进行插入操作的端称为队尾,进行删除操作的端称为队头.即入队只能从队尾入,出队 ...
- 将本地分支push到远程分支
git push origin [localbranch]:[remotebranch]
- 二十二、Spring MVC与Structs2的区别总结
一.框架的入口 1.Structs2采用Filter(StructsPrepartAndExecuteFilter)来进行实现. 2.SpringMVC采用Servlet(DispatcherServ ...
- 启动Oracle时提示:ORA-01078:failure in processing system parameters
一.使用环境操作系统:CentOS release 6.2 (Final) 数据库:Oracle 12g数据库主目录:/ora12/product/product/12.1.0/db_1 二.问题描述 ...
- java后台判断浏览器的版本
public static void main(String[] args) { String agent=request.getHeader("User-Agen ...