一、函数

可以完成特定功能的代码块,函数就是存放代码块的容器

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 九、函数的更多相关文章

  1. python之路(九)-函数装饰器

    装饰器 某公司的基础业务平台如下: def f1(): print('这是f1业务平台') def f2(): print('这是f2业务平台') def f3(): print('这是f3业务平台' ...

  2. day9.初始函数练习题

    1.写函数,检查获取传入列表或元组对象的所有奇数位索引对应的元素,并将其作为新列表返回给调用者. def new(args): a = [] for I in range(1,len(args),2) ...

  3. day9.初识函数

    python3 函数 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段. 函数能提高应用的模块性,和代码的重复利用率.你已经知道Python提供了许多内建函数,比如print().但你 ...

  4. day9 匿名函数 lambda

    1. list列表排序 #### sort排序 nums = [,,,,,] nums.sort() print(nums) ### 结果 [, , , , , ] ######## 逆序 In [] ...

  5. python学习笔记(九)函数返回多个值,列表生成式,循环多个变量,入参格式声明

    一.函数返回多个值 1.函数如果返回多个值的话,它会把这几个值放到一个元组里面2.函数如果返回多个值的话,也可以用多个变量来接收 def say(): num1 = num2 = num3 = ret ...

  6. python学习笔记(九)-函数2

    交换两个变量的值 a = 2 b = 1 b = 1 a = 2 #方式一: b,a = a,b #交换两个变量的值 print(a,b) #方式二: a = a + b #3 b = a - b # ...

  7. C语言库函数大全及应用实例九

    原文:C语言库函数大全及应用实例九                                                [编程资料]C语言库函数大全及应用实例九 函数名: mktemp 功 ...

  8. linux shell学习笔记

    一  变量 声明变量: my_var='ddd'使用变量: ${my_var}设置为只读变量: readonly my_var删除变量: unset my_var 注意只读变量不能被删除 变量类型:( ...

  9. 《sqlite权威指南》读书笔记 (一)

    一 常量 字符串常量   (使用单引号括住.如果常量中有单引号,使用两个单引号来表示.大小写敏感) 数字常量 二进制常量 二 关键字 关键字大小写不敏感 三 注释 单行注释使用 --XXXXXXX 多 ...

随机推荐

  1. wifipineapple获取用户上网信息

    ssh连接到wifipineapple: 输入连接信息:ssh root@172.16.42.1 输入密码:pineapplesareyummy 安装依赖基本环境: opkg update opkg ...

  2. 多线程本地图片载入演示样例【OpenCV】【Pthread】

    Pthread barrier的简单使用演示样例: C++代码例如以下: // ThreadingLoadImages.cpp : 定义控制台应用程序的入口点. // #include "s ...

  3. JDK自带JVM性能调优监控工具jps、jstack、jmap、jhat、jstat

    原文地址:https://www.jianshu.com/p/db954cb968fb JVM性能调优监控工具jps.jstack.jmap.jhat.jstat位于JDK的bin目录,这些工具短小精 ...

  4. SNF快速开发平台MVC-高级查询组件

    1.   高级查询 在我们做项目的时候经常想要按名称.编号进行查询数据,可在开发时会把最常用的查询条件写上,不常用的就不写了,也是因为把所有字段都写上太多了,布局不好看而且不实用.还有些查询条件几百年 ...

  5. 解决zabbix的中文乱码

    CentOS7.1 x64上下载了zabbix官方的rpm包,导入后使用yum安装了zabbix 3.2.6,但是启动zabbix server的时候报了个段错误的错,谷歌了一会儿,发现段错误不止一次 ...

  6. Spring Boot 2.0 整合Thymeleaf 模板引擎

    本节将和大家一起实战Spring Boot 2.0 和thymeleaf 模板引擎 1. 创建项目 2. 使用Spring Initlizr 快速创建Spring Boot 应用程序 3. 填写项目配 ...

  7. 物联网架构成长之路(16)-SpringCloud从入门到吹水

    1.前言 Spring Cloud 现在比较流行,版本更新也是蛮快的,网上资料也是很多.很多参考网上资料就可以学到了.这里给个 http://blog.csdn.net/forezp/article/ ...

  8. 对ThreadLocal实现原理的一点思考

    前言 在<透彻理解Spring事务设计思想之手写实现>中,已经向大家揭示了Spring就是利用ThreadLocal来实现一个线程中的Connection是同一个,从而保证了事务.本篇博客 ...

  9. python打开文件的N种姿势

    # python打开文件的N种姿势 print('[1]使用open()函数+简单for循环') f1 = open('python.txt') for line in f1: print(line. ...

  10. Selenium Web 自动化 - 项目实战环境准备

    Selenium Web 自动化 - 项目实战环境准备 2016-08-29 目录 1 部署TestNG  1.1 安装TestNG  1.2 添加TestNG类库2 部署Maven  2.1 mav ...