day9 九、函数
一、函数
可以完成特定功能的代码块,函数就是存放代码块的容器
1、定义函数的语法:
函数四部分:(函数执行的本质:执行函数体,得到函数返回值)
①函数名 ②函数体 ③返回值 ④参数
# 用def关键词来声明函数 def 函数名(参数们)
函数体
return返回值 def fn(money):
print('你付了%s元钱' % money)
print('函数的一行代码')
print('函数的二行代码')
return '冰红茶'
print(fn, id(fn)) # fn直接打印,只能看到函数存放代码的地址 fn(10)
msg = fn(10)
print(msg) # 函数的返回值也称之为函数值,就是函数执行结束后的结果
# 可以用变量接受 | 可以直接打印 | 可以直接使用
2、如何使用函数(函数一定要先定义在调用)
函数名:拿到函数的地址
函数名():拿到函数的地址,并执行函数中存放的代码块(函数体)
函数名(参数):执行函数并传入参数
函数名():执行完毕后,会得到函数的返回值,返回值就跟普通变量一样,可以直接打印、使用、运算
def fn(num):
print("传入的num值:%s" % num)
return '收到了' res = fn(10) # 控制台会打印:传入的num值:10
# res的值为:'收到了'
3、函数的分类
①按函数体进行分类
# 空函数:项目之初,知道项目有哪些功能,但还没有明确功能体,可以用pass进行函数体填充
def computed():
pass
# 非空函数:有函数体
def add(n1, n2):
return n1 + n2
res = add(10, 20) # 结果为 30
print(res)
②按参数列表进行分类
# 无参函数:函数体运行不需要外界提供参数
def msg():
print('hello')
msg() # 有参函数:函数体运行需要外界提供参数
def msg(p1, p2):
print('欢迎%s和%s' % (p1, p2))
p1 = input('输入一号领导名:')
p2 = input('输入二号领导名:')
msg(p1, p2)
③按返回值进行分类:return是用来结束函数的
# 空返回
没有return的函数
空return # 值返回
return一个值
return多个值 # 空返回
def fn1():
print('fn1 run') def fn2():
print('fn2 run')
return
return None
res = fn2() # 无return函数与空return函数的区别
# 空return:可以根据具体情况主动退出函数(像break结束循环一样) # 值返回
# 一个值的返回
def add(n1, n2):
return n1 + n2
print(add(10, 15)) def computed(n1, n2):
# 返回四则运算的结果
r1 = n1 + n2
r2 = n1 - n2
r3 = n1 / n2
r4 = n1 * n2
return [r1, r2, r3, r4] a, b, c, d = computed(50, 25)
print(a, b, c, d) # 多个值的返回: 本质就是返回装有多个值的元组
def computed(n1, n2):
# 返回四则运算的结果
r1 = n1 + n2
r2 = n1 - n2
r3 = n1 // n2
r4 = n1 ** n2
return r1, r2, r3, r4 a, b, c, d = computed(50, 25)
print(a, b, c, d) res = computed(50, 25) # 得到的是装有所有结果的元组
print(res)
4、函数的嵌套调用
①定义:在一个函数内调用另一个函数。在解释过程中,不执行函数体,在函数被调用时,函数体才被执行
def fn1():
print('fn1 run')
fn2() def fn2():
print('fn2 run')
fn3() def fn3():
print('fn3 run') # 注:在fn1中调用了fn2,所以调用fn1的逻辑应该在fn2定义之后
fn1()
②案例
# 案例:用函数实现获取两个数的最大值
def max_2(n1, n2):
if n1 > n2:
return n1
return n2 print(max_2(200, 30)) # 获取三个数的最大值
def max_3(n1, n2, n3):
if n1 > n2 and n1 > n3:
return n1
if n2 > n1 and n2 > n3:
return n2
return n3
def max_3(n1, n2, n3):
m2 = max_2(n1, n2)
return max_2(m2, n3) print(max_3(300, 30, 30)) # 四个数
def max_4(n1, n2, n3, n4):
m2 = max_2(n1, n2)
return max_3(m2, n3, n4)
print(max_4(10,30,20,0))
5、指定文件名的文件复制
def copy_file(source, target):
with open(source, 'rb') as r, open(target, 'wb') as w:
for line in r:
w.write(line) copy_file('cmd.txt', 'aaa.txt')
copy_file('temp.txt', 'ttt.txt')
6、偏函数:先给函数传一个值进去
from functools import partial def test(x, y, z):
return x + y + z test = partial(test, 1)
print(test(2, 3)) #
二、例子
1、定义一个函数,该函数可以实现控制台输入,最终返回一个int类型的正整数
def fn1():
while True:
num = input("num: ")
if num.isdigit():
return int(num)
res = fn1()
print(res)
2、定义一个函数,该函数可以实现用户录入,最终返回一个int类型的负整数
def fn2():
while True:
num = input("num: ")
b1 = num.startswith('-')
b2 = num.count('-') == 1
if b1 and b2 and num.split('-')[1].isdigit(): # and短路
return int(num)
res = fn2()
print(res)
3、定义一个函数,实现传入一个数或是字符串,返回值是 是否 是可转换为整数类型的数据
def fn3(num):
if isinstance(num, (int, float)):
return True
elif isinstance(num, str):
b1 = num.startswith('-')
b2 = num.count('-') == 1
if b1 and b2 and num.split('-')[1].isdigit():
return True
elif num.isdigit():
return True
return False
print(fn3('-3'))
4、定义一个函数,实现传入一个整型数字,判断并直接打印该数字是否是奇数还是偶数
def fn4(num):
if num % 2 == 0:
print('偶数')
else:
print('奇数')
print(fn4(10))
5、定义一个函数,实现判断传入数据的类型,并直接打印其类型
def fn5(any_arg):
if isinstance(any_arg, bool):
print('布尔')
return
if isinstance(any_arg, int):
print('整型')
fn5(True)
6、定义一个函数,只要传入 "k1:v1,...,kn:vn" 格式的字符串,都可以将其转换为 {'k1':'v1',...,'kn':'vn'}
def fn7(string):
dic = {}
k_v_s = string.split(',')
for k_v in k_v_s:
k, v = k_v.split(':')
dic[k] = v
return dic
print(fn7('k1:v1,k2:v2,kn:vn'))
7、定义一个函数,实现列表与元组类型的反转功能
def fn8(arg):
if isinstance(arg, tuple):
return list(arg)
return tuple(arg)
print(fn8([1, 2]))
8、定义一个函数,可以完成对list、tuple、dict、set四种类型数据的循环变量打印, 不是这四种,则打印 "暂不支持该数据遍历"
def fn9(arg):
if isinstance(arg, (list, tuple, dict, set)):
for v in arg:
print(v)
else:
print("暂不支持该数据遍历")
fn9({'a': 1})
9、定义一个函数,实现对单列集合进行去重的功能 # 解析:单列集合有list、tuple、set
传入list、tuple、set,返回去重后的list、tuple、set,考虑可变与不可变类型的不同处理
def fn10(arg):
if isinstance(arg, set): # set直接返回
return arg
temp_list = [] # 去重列表
for v in arg:
if v not in temp_list:
temp_list.append(v)
if isinstance(arg, tuple): # tuple就转换后返回
return tuple(temp_list)
return temp_list # 就只剩list了
10、定义一个函数,实现文件(不一定是文本文件)的跨文件夹的剪切
解析:1.传入要读取的目标文件夹中的目标文件
2.在被告知的目标文件夹下复制成同名文件
3.调用os中删除文件的功能将原文件删除
import os
def fn11(file, folder):
with open(file, 'rb') as r:
# 文件名
file_name = r.name
path = r'%s\%s' % (folder, file_name)
with open(path, 'wb') as w:
for line in r:
w.write(line)
os.remove(file) fn11('temp.txt', 'abc')
day9 九、函数的更多相关文章
- python之路(九)-函数装饰器
装饰器 某公司的基础业务平台如下: def f1(): print('这是f1业务平台') def f2(): print('这是f2业务平台') def f3(): print('这是f3业务平台' ...
- day9.初始函数练习题
1.写函数,检查获取传入列表或元组对象的所有奇数位索引对应的元素,并将其作为新列表返回给调用者. def new(args): a = [] for I in range(1,len(args),2) ...
- day9.初识函数
python3 函数 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段. 函数能提高应用的模块性,和代码的重复利用率.你已经知道Python提供了许多内建函数,比如print().但你 ...
- day9 匿名函数 lambda
1. list列表排序 #### sort排序 nums = [,,,,,] nums.sort() print(nums) ### 结果 [, , , , , ] ######## 逆序 In [] ...
- python学习笔记(九)函数返回多个值,列表生成式,循环多个变量,入参格式声明
一.函数返回多个值 1.函数如果返回多个值的话,它会把这几个值放到一个元组里面2.函数如果返回多个值的话,也可以用多个变量来接收 def say(): num1 = num2 = num3 = ret ...
- python学习笔记(九)-函数2
交换两个变量的值 a = 2 b = 1 b = 1 a = 2 #方式一: b,a = a,b #交换两个变量的值 print(a,b) #方式二: a = a + b #3 b = a - b # ...
- C语言库函数大全及应用实例九
原文:C语言库函数大全及应用实例九 [编程资料]C语言库函数大全及应用实例九 函数名: mktemp 功 ...
- linux shell学习笔记
一 变量 声明变量: my_var='ddd'使用变量: ${my_var}设置为只读变量: readonly my_var删除变量: unset my_var 注意只读变量不能被删除 变量类型:( ...
- 《sqlite权威指南》读书笔记 (一)
一 常量 字符串常量 (使用单引号括住.如果常量中有单引号,使用两个单引号来表示.大小写敏感) 数字常量 二进制常量 二 关键字 关键字大小写不敏感 三 注释 单行注释使用 --XXXXXXX 多 ...
随机推荐
- Shell获取某目录下所有文件夹的名称
查看目录下面的所有文件: #!/bin/bash cd /目标目录 for file in $(ls *) do echo $file done 延伸的方法,查看目录下面的所有目录 #!/bin/ba ...
- 使用Genymotion模拟器调试出现INSTALL_FAILED_CPU_ABI_INCOMPATIBLE错误的解决办法
如果遇到下面这种错误: 点击下载Genymotion-ARM-Translation.zip 百度云连接:http://pan.baidu.com/s/1o6ifjMM 将你的虚拟器启动起来,将下载好 ...
- hihocoder第238周:杨氏矩阵的个数
题目链接 问题描述 给定一个N行M列的矩阵,往里面填入$1-N\times M$个数字,使得这个矩阵每行.每列都满足递增.问:有多少种填法? 问题分析 这个问题很难,如果能够直接想到,那就是天才了. ...
- 【Babble】批量学习与增量学习、稳定性与可塑性矛盾的乱想
一.开场白 做机器学习的对这几个词应该比较熟悉了. 最好是拿到全部数据,那就模型慢慢选,参数慢慢调,一轮一轮迭代,总能取得不错效果. 但是面对新来数据,怎么能利用已经训练好的模型,把新的信息加进去? ...
- 管理 Oracle Cluster Registry(OCR)
oracle的clusterware包含两个重要组件:OCR(包含本地组件OLR)和voting disks --OCR管理oracle clusterware和oracle rac数据库的配置信息 ...
- selenium是如何启动浏览器的
前几天有同学问到selenium是怎么样启动浏览器的(selenium启动浏览器的原理),当时稍微讲解了一下,不过自我感觉不够具体,现在特地把启动原理通过代码和一系列操作给串联起来,希望可以帮助大家更 ...
- java中使用队列:java.util.Queue(转)
队列是一种特殊的线性表,是运算受到限制的一种线性表,只允许在表的一端进行插入,而在另一端进行删除元素的线性表.队尾(rear)是允许插入的一端.队头(front)是允许删除的一端.空队列是不含元素的空 ...
- 何为编码 GBK 和 UTF8编码?GBK,GB2312与区位码有何关系?
何为GBK,何为GB2312,与区位码有何渊源? 区位码是早些年(1980)中国制定的一个编码标准,如果有玩过小霸王学习机的话,应该会记得有个叫做“区位”的输入法(没记错的话是按F4选择).就是打四个 ...
- phpmyadmin登录提示mysqli_real_connect(): (HY000/2002): No such file or directory和mysql8登录失败的问题
网上的解决方法有很多,但都无法解决我的问题,最后在stackoverflow上找到解决方法,原文地址:https://stackoverflow.com/questions/41881123/mysq ...
- chrome调试手机webview中页面
http://blog.csdn.net/freshlover/article/details/42528643 注: 1. 可以调试真机上页面(USB连接)和虚拟机上页面 2. 手机系统需要4.4+ ...