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 ...
随机推荐
- C# 有哪些集合
队列[Queue] //队列:先进先出 /* *增加元素到队列结尾处 *移除队列开始处 */ Queue queue=new Queue(); queue.Enqueue(Object); queue ...
- 牛客寒假算法基础集训营6 I-wzoi
题目链接 分析:这个题本质上可以看成是一个括号匹配题,因为当出现00和11的时候,毫无疑问是前一天看题,后一天写题,这样可以得到最大的得分10 将全部00和11删掉后,就是交替出现的01串了 代码如下 ...
- SQL Server跨服务器建立视图
create view View_AppCus as select dwmch,zjm from ksoa.dbo.mchk SQL Server跨服务器操作经常需要用到,下面就为你介绍的是SQL S ...
- Windows下Python3.6安装第三方模块
一 安装pip 一般需要用pip进行安装,不过我安装p3.6的时候pip已经有了. 如果没有的话,可以用在以下http://www.lfd.uci.edu/~gohlke/pythonlibs/#pi ...
- Linux使用ntpdate和ntpd进行时间同步
生产环境关联主机间常要求时间一致,若有NTP时间同步服务器,可配置各主机与时间同步服务器同步时间. 1.使用ntpdate进行时间同步 安装ntp客户端: yum install ntpdate 同步 ...
- WebSphere概要文件的创建与删除
一.创建单server服务器 /was/bin/manageprofiles.sh -create -profileName server1 \ -profilePath /was/profiles/ ...
- 把旧系统迁移到.Net Core 2.0 日记 (18) --JWT 认证(Json Web Token)
我们最常用的认证系统是Cookie认证,通常用一般需要人工登录的系统,用户访问授权范围的url时,会自动Redirect到Account/Login,登录后把认证结果存在cookie里. 系统只要找到 ...
- liunx文件操作 文件查看
文件的阅读命令 head 命令 head命令可以用来查看文件的开头部分,命令的格式是: head 文件名 默认设置,它只查看文件的前10行.但可以通过指定一个数字选项来改变要显示的行数,命令如下 he ...
- js将接口返回的数据序列化
<div style={{marginLeft: '80px'}}> <pre> {th ...
- Java工厂方法模式
工厂方法模式: /** * 工厂方法模式:也叫工厂模式,属于创建型模式,父类工厂(接口)负责定义产品对象的公共接口, * 而子类工厂负责创建具体的产品对象. * 目的:是为了把产品的实例化操作延迟到子 ...