函数的作用

编程大师Martin Fowler先生曾经说过:“代码有很多种坏味道,重复是最坏的一种!”,要写出高质量的代码首先要解决的就是重复代码的问题。例如3次求阶乘:

m = int(input('m = '))
n = int(input('n = '))
fm =
for num in range(, m + ):
fm *= num
fn =
for num in range(, n + ):
fn *= num
fmn =
for num in range(, m - n + ):
fmn *= num
print(fm // fn // fmn)

对于上面的代码来说,我们可以将计算阶乘的功能封装到一个称之为“函数”的功能模块中,在需要计算阶乘的地方,我们只需要“调用”这个“函数”就可以了。

定义函数

在Python中可以使用def关键字来定义函数,和变量一样每个函数也有一个响亮的名字,而且命名规则跟变量的命名规则是一致的。在函数名后面的圆括号中可以放置传递给函数的参数,这一点和数学上的函数非常相似,程序中函数的参数就相当于是数学上说的函数的自变量,而函数执行完成后我们可以通过return关键字来返回一个值,这相当于数学上说的函数的因变量。

在了解了如何定义函数后,我们可以对上面的代码进行重构,所谓重构就是在不影响代码执行结果的前提下对代码的结构进行调整,重构之后的代码如下所示。

def factorial(num):
"""
求阶乘
"""
result = 1
for n in range(1, num + 1):
result *= n
return result m = int(input('m = '))
n = int(input('n = '))
# 当需要计算阶乘的时候不用再写循环求阶乘而是直接调用已经定义好的函数
print(factorial(m) // factorial(n) // factorial(m - n))

函数的参数

函数是绝大多数编程语言中都支持的一个代码的“构建块”,但是Python中的函数与其他语言中的函数还是有很多不太相同的地方,其中一个显著的区别就是Python对函数参数的处理。在Python中,函数的参数可以有默认值,也支持使用可变参数,所以Python并不需要像其他语言一样支持函数的重载,因为我们在定义一个函数的时候可以让它有多种不同的使用方式,下面是两个小例子。

from random import randint

def roll_dice(n=2):
"""
摇色子
n: 色子的个数
return: n颗色子点数之和
"""
total = 0
for _ in range(n):
total += randint(1, 6)
return total def add(a=0, b=0, c=0):
return a + b + c # 如果没有指定参数那么使用默认值摇两颗色子
print(roll_dice())
# 摇三颗色子
print(roll_dice(3))
print(add())
print(add(1))
print(add(1, 2))
print(add(1, 2, 3))
# 传递参数时可以不按照设定的顺序进行传递
print(add(c=50, a=100, b=200))

我们给上面两个函数的参数都设定了默认值,这也就意味着如果在调用函数的时候如果没有传入对应参数的值时将使用该参数的默认值,所以在上面的代码中我们可以用各种不同的方式去调用add函数,这跟其他很多语言中函数重载的效果是一致的。

其实上面的add函数还有更好的实现方案,因为我们可能会对0个或多个参数进行加法运算,而具体有多少个参数是由调用者来决定,我们作为函数的设计者对这一点是一无所知的,因此在不确定参数个数的时候,我们可以使用可变参数,代码如下所示。

# 在参数名前面的*表示args是一个可变参数
# 即在调用add函数时可以传入0个或多个参数
def add(*args):
total = 0
for val in args:
total += val
return total
print(add())
print(add(1))
print(add(1, 2))
print(add(1, 2, 3))
print(add(1, 3, 5, 7, 9))

练习

1、定义一个简单的函数

def H(user):
vip = ['','','']
if user in vip:
print("ok")
else:
print("error")
user = input()
H(user)

2、购买商品

def Check_Goods(g):
G = ['汽车','火车','飞机']
if g in G:
Address()
else:
return False def Check_Info(name,phone,Addr):
is_ok=True
if name=="" or name ==" ":
is_ok = False
if len(phone) !=11:
is_ok = False
if Addr not in ['北京','山东']:
is_ok = False
return is_ok
def Address():
Name = input("姓名:")
Phone = input("电话:")
Addr = input("地址:")
res = Check_Info(Name,Phone,Addr)
if (res):
Note()
return False def Note():
print("马上发货") def Start():
print("欢迎光临")
g = input("请输入商品:")
Check_Goods(g) Start()

3、用户注册

count = 0
def users():
users_ = input('请输入用户名:')
z = 'qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM'
n = ''
t = '!@!$#%^&*'
is_z = False
is_n = False
is_t = True
for i in users_:
if i in z:
is_z = True
if i in n:
is_n = True
if i in t:
is_t = False
if is_n and is_t and is_z:
password()
else:
print('输入有误') def password():
passwd = input('请输入密码:')
if len(passwd)<6:
print('密码必须大于六位')
else:
phone() def phone():
p = input('请输入电话号:')
if len(p) == 11:
print('验证码已发送')
vn()
else:
print('手机号为11位') def vn():
import random
import time
global count
num = random.randrange(1000,9999)
count += 1
start_time = time.time()
print('东方智业:%d'%num)
num_ = int(input('请输入验证码:'))
end_time = time.time() sub_time = end_time - start_time
if (sub_time > 3):
if count > 2:
print("验证码获取次数过多")
exit()
print("验证码超时,请重发。。。")
time.sleep(2)
vn()
else:
if num == num_:
print("注册成功")
else:
print("验证码错误") def start():
users()
start()

python第三课--函数的更多相关文章

  1. python的三个函数(eval、exec、complie)和python版RMI

    一.python的三个函数: 1.eval函数: 之前已经讲过了这个函数,该函数也类似于php的eval,例如下边这个例子 eval("os.system('id')") 但是有个 ...

  2. Python第三周 函数详解

    def 函数名(): """注释说明"""" 执行逻辑体 return 返回值 定义不带参数的函数 带参数的函数 默认参数 这个是 ...

  3. Python 基础三 文件 函数

    今天回顾一下之前学的文件操作相关知识点,对于文件的操作,主要有一下几部分构成: 一.文件的基础知识 1.文件操作的基本流程 文件操作其实可以分成三大部分: 1.打开文件,获取文件句柄并赋予一个变量 2 ...

  4. 人生苦短我用Python 第三周 函数周

    函数的定义: 1,def 函数名(参数1,参数2......): "注释:函数的作用和参数,增加可读性", 2,函数体 3,返回值 最简单的函数: def func(): prin ...

  5. 新手Python第三天(函数)

    Python 函数的创建 def func2(): print('haha') # 函数的返回值 # 函数的返回值,没有定义返回None, # 有一个返回值返回这个object(可以返回一个函数对象) ...

  6. 小哈学Python第三课-字符集编码

    table.hovertable { font-family: verdana, arial, sans-serif; font-size: 11px; color: #333333; border- ...

  7. python第三课——数据类型2

    day03: 1.列表:list 特点:有序的(有索引.定义和显示顺序是一致的).可变的(既可以改变元素内容也可以自动扩容).可重复的. 可以存储任何的数据类型数据 定义个列表如下: lt = ['宋 ...

  8. python基础三:函数

    def name(参数1,参数2,参数3,...) 可以自定义一些自己需要的函数来简化自己的工作. 如:自定义一个计算函数 def  mycount(a,b,c): y=a+b-c return y ...

  9. python第三课

    本节内容 1.列表 2.购物车设计思路 3.字典 1.列表 不可变类型:整型.字符串.元组tuple 可变类型:列表list.字典dict 2.购物车 3.字典

随机推荐

  1. C#中产生SQL语句的几种方式

    (1)拼接产生SQL语句: string sql = "insert into czyb(yhm,mm,qx) values('" + txtName.Text + "' ...

  2. 一、JavaScript概述

    1.Javascript是什么?可以做什么? 1)    JavaScript是一种基于对象和事件驱动的解释性脚本语言, 它具有与Java和C语言类似的语法. 2)    JavaScript可直接嵌 ...

  3. js常用设计模式实现(三)建造者模式

    创建型模式 创建型模式是对一个类的实例化过程进行了抽象,把对象的创建和对象的使用进行了分离 关于创建型模式,已经接近尾声了,还剩下建造者模式和原型模式,这一篇说一说建造者模式 建造者模式的定义 将一个 ...

  4. 使用cmd打开磁盘目录和文件

    例如: 1.进入e盘 2.查看E盘下所有文件 3.进入指定文件夹

  5. java将复数字符串虚部实部分离,并实现加减运算

    java字符串构造复数 将字符串分解为复数的实部和虚部 定义一个复数类,数据成员有实部和虚部,根据传参不同构造方法重载,并定义复数的加减方法,以及toString方法.有难度的便是用字符串构造复数了, ...

  6. Golang 高效实践之并发实践

    前言 在我前面一篇文章Golang受欢迎的原因中已经提到,Golang是在语言层面(runtime)就支持了并发模型.那么作为编程人员,我们在实践Golang的并发编程时,又有什么需要注意的点呢?下面 ...

  7. 简单函数编写_strcpy、_stroverchg、_strcmp

    字符串复制函数 void _strcpy(char *tar, const char * res) { char *p = tar; while(assert(tar && res), ...

  8. 《ElasticSearch6.x实战教程》之父-子关系文档

    第七章-父-子关系文档 打虎亲兄弟,上阵父子兵. 本章作为复杂搜索的铺垫,介绍父子文档是为了更好的介绍复杂场景下的ES操作. 在非关系型数据库数据库中,我们常常会有表与表的关联查询.例如学生表和成绩表 ...

  9. 个人永久性免费-Excel催化剂功能第45波-逻辑判断函数增强

    自定义函数的最大的作用是可以按需定制,在Excel的原生函数不提供的场景时,传统方法需要使用大量的嵌套函数去实现,实在太累,今天Excel催化剂再次送上一波绝对十分常用的函数逻辑判断类函数给大家使用! ...

  10. vue教程(二)--过滤器和监视改动功能

    过滤器filter: 1.将数据进行添油加醋的操作. 2.过滤器分两种: 组件内的过滤器(组件内有效). 全局过滤器 组件内:filters:{过滤器名:过滤器函数fn},fn内通过return 返回 ...