函数的作用

编程大师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. ~~函数基础(七):生成器&迭代器~~

    进击のpython 生成器 上来说个这,就有点抽象了! 我们先整点活儿 宁,准备好了吗? 直接相位猛冲! 列表生成器 需求来了,老弟!我有一个数组 a = [1, 2, 3, 4, 5, 6, 7, ...

  2. 对于springboot的几种注入方法的个人看法

    最近在知乎上面看到一篇关于程序员面试的问题,面试官问我们一般有几种注入的方法,这几种注入的方法分别在什么时候运用比合理,当时我看到这个时候懵逼了,由于我自己也是刚刚接触springboot不久,所以就 ...

  3. WordPress教程之页面、菜单、媒体库、高级定制

    本系列教程链接: 怎么快速搭建一个WordPress网站 Wordpress教程之初识WordPress Wordpress教程之如何入门WordPress Wordpress教程之如何创建博客内容 ...

  4. Junit简单的案例

    Calculator: public class Calculator { public double add(double number1, double number2) { return num ...

  5. React中创建组件的3种方式

    目前作者所知道的创建react组件的方式有三种: 函数式定义(无状态组件) function MyComponent(props){ return( <h1>mycomponent< ...

  6. 小白学python-day06-

    今天是day06,以下是学习内容总结: 但行努力,莫问前程. --------------------------------------------------------------------- ...

  7. Anacodna之conda的使用

    yum install -y bunzip2 wget https://repo.continuum.io/archive/Anaconda2-5.0.1-Linux-x86_64.sh chmod ...

  8. jsp的简介(1)

    一.什么是Java Server Pages? JSP全称Java Server Pages,是一种动态网页开发技术.它使用JSP标签在HTML网页中插入Java代码.标签通常以<%开头以%&g ...

  9. web设计_3_可伸缩的导航栏

    1. HTML5构建一个选项卡,需要<nav>标签包围一个无序列表,也可以添加role属性告诉辅助设备(如屏幕阅读器)这个元素所扮演的角色. 绝对不要基于图片的导航,对搜索引擎不友好,更新 ...

  10. 搭建PowerDNS+LAP+NFS+MySQL主从半节点同步实现LAMP架构

    实验环境:(共7台机器) PowerDNS: 192.168.99.110    两台LAP: 192.168.99.120 和 192.168.99.130 NFS服务器:192.168.99.14 ...