python封装函数入门_Python零基础快速入门(十):函数

第10节课程大纲

一、初识函数

1.1 函数的作用

1.2 函数的组成

1.3 定义和调用函数

二、函数的进阶使用

2.1 参数类型

2.2 返回多个值

三、多个函数间配合

3.1 变量作用域

3.2 函数的嵌套

一、初识函数

1.1 函数的作用

函数是Python里增强代码重用性最有力的工具

1.2 函数的组成

在python中,“喂”给函数一些数据,它就能内部消化,执行相应的功能,最终给你“吐”出你想要的东西,就好比自动贩卖机一样

函数后面的括号里放的东西,也就是我们需要输入给函数的数据,它在函数中被称作【参数】。【参数】指向的是函数要接收、处理怎样的数据(你也可以把它理解成自变量)。

除了Python自带的内置函数,也可以根据自己的需要,自己定义一个独一无二的函数

1.3 定义和调用函数

定义函数:定义函数的基本语法

示例:

def math(x):

y = 3x + 5

return y

#第1行:def的意思是定义(define),math是【函数名】(自己取的),再搭配一个英文括号和冒号,括号里面的x是参数(参数名也是自己取)。

#第2行:def下一行开始缩进的代码就是函数要实现的功能,也叫【函数体】。这里的功能就是:根据x计算出一个值y。

#第3行:return语句是返回的意思,可以指定函数执行完毕后最终会返回什么值或表达式,否则计算机是无法判断出函数最终要输出什么结果的。

定义函数的语法并不难,但有些注意事项一开始要特别注意才能少踩坑,我将其标记在下面代码块的注释里,请你仔细阅读下。

# 函数名:1. 名字最好能体现函数的功能,一般用小写字母和单下划线、数字等组合

# 2. 不可与内置函数重名(内置函数不需要定义即可直接使用)

def math(x):

# 参数:根据函数功能,括号里可以有多个参数,也可以不带参数,命名规则与函数名相同

# 规范:括号是英文括号,后面的冒号不能丢

y = 3*x + 5

# 函数体:函数的执行过程,体现函数功能的语句,要缩进,一般是四个空格

return y

# return语句:后面可以接多种数据类型,如果函数不需要返回值的话,可以省略

调用函数:

定义函数只是将函数的内部功能封装起来(组织好),调用函数需要输入函数名和参数所对应的值,这个过程在函数里叫作参数的传递(pass)。

def math(x):

y = x ** 2 + x

return y

a = math(10)

print(a)

# math(10)的意思是将整数10赋值给参数x并运行该函数。函数执行完毕后最终返回了y的值即110,然后将这个结果赋值给变量a,再用print()将变量a打印出来。

练习:自己写一个len()函数

# 思路:1. 设置一个初始为0的计数器;2.遍历字符串,每遍历一次,计数器加一;3.返回计数器的值。

# 定义len()函数

def my_len(words):

counter = 0

for i in words:

counter = counter + 1

return counter

# 调用函数

a = '三根皮带,四斤大豆'

print(my_len(a))

#等价于print(my_len('三根皮带,四斤大豆'))

二、函数的进阶使用

2.1 参数类型

这一部分,主要介绍函数中常见的位置参数、默认参数和不定长参数。

#无参数 无返回值

def opening():

print('总有一种味道能温暖你~')

print('深夜食堂正式开业啦!')

print('欢迎来自五湖四海的你前来品尝!')

opening()

位置参数:

# 多个参数

def menu(appetizer, course):

print('一份开胃菜:' + appetizer)

print('一份主食:' + course)

menu('话梅花生','牛肉拉面')

#这里的'话梅花生'和'牛肉拉面'是对应参数的位置顺序传递的,所以appetizer和course被叫作【位置参数】,当有多个参数的时候,我们就必须按照顺序和数量传递,这也是最常见的参数类型。

#如果采用下面这种形式传递,就不需要理会参数位置

menu(course = '牛肉拉面', appetizer = '话梅花生')

默认参数:

⚠️默认参数必须放在位置参数之后。

def menu(appetizer, course, dessert = '绿豆沙'):

print('一份开胃菜:' + appetizer)

print('一份主食:' + course)

print('一份甜品:' + dessert)

menu('话梅花生','牛肉拉面')

#因为已经默认将'绿豆沙'传递给dessert,调用时无须再传递。

默认参数并不意味着不能改变,可以通过调用时传递新值进行替换

def menu(appetizer, course, dessert = '绿豆沙'):

print('一份开胃菜:' + appetizer)

print('一份主食:' + course)

print('一份甜品:' + dessert)

menu('话梅花生','牛肉拉面','银耳羹')

#银耳羹对应参数dessert。替换调了‘绿豆沙’

不定长参数:传递给参数的数量是可选的、不确定的。

不定长参数的格式比较特殊,是一个星号*加上参数名,它的返回值也比较特殊

def menu(*barbeque):

for i in barbeque:

print('一份烤串:' + i)

menu('烤香肠', '烤肉丸')

menu('烤鸡翅', '烤茄子', '烤玉米')

# 不定长参数可以接收任意数量的值

不定长参数的示例:print()函数

print()函数完整参数:print(*objects, sep = ' ', end = '\n', file = sys.stdout, flush = False)

第一个参数objects,带了*号,为不定长参数——这也是为什么print()函数可以传递任意数量的参数。其余四个为默认参数,我们可以通过修改默认值来改变参数,对比一下下列代码的输出结果。

print('金枪鱼', '三文鱼', '鲷鱼')

#返回结果:金枪鱼 三文鱼 鲷鱼

print('金枪鱼', '三文鱼', '鲷鱼', sep = '+')

# sep控制多个值之间的分隔符,默认是空格

#返回结果:金枪鱼+三文鱼+鲷鱼

print('金枪鱼', '三文鱼', '鲷鱼', sep = '+', end = '=?')

# end控制打印结果的结尾,默认是换行)

#返回结果:金枪鱼+三文鱼+鲷鱼=?

2.2 返回多个值

函数,不仅可以支持输入多个参数,而且也可以同时输出多个值。要返回多个值,只需将返回的值写在return语句后面,用英文逗号隔开即可。

import random

appetizer = ['话梅花生','拍黄瓜','凉拌三丝']

def coupon(money):

if money < 5:

a = random.choice(appetizer)

return a

elif 5 <= money < 10:

b = random.choice (appetizer)

return b, '溏心蛋'

print(coupon(6))

print(type(coupon(6)))

三、多个函数间配合

3.1 变量作用域

局部变量:一个在函数内部赋值的变量仅能在该函数内部使用(局部作用域),它们被称作【局部变量】

全局变量:在所有函数之外赋值的变量,可以在程序的任何位置使用(全局作用域),它们被称作【全局变量】

在这个例子中,变量rent是在函数外被赋值的,所以它是全局变量,能被sum_cost()函数直接使用;而变量variable_cost是在cost()函数内定义的,属于局部变量,其余函数内部如sum_cost()无法访问。事实上,当cost()函数执行完毕,在这个函数内定义的变量都会"消失”。

如何解决“局部变量”和”全局变量“之间的矛盾呢?有几种方法可供参考:

第一种方法:把局部变量都放在函数外,变成全局变量。

# 以上面的代码为例:

rent = 3000

utilities = int(input('请输入本月的水电费用'))

food_cost = int(input('请输入本月的食材费用'))

variable_cost = utilities + food_cost

# 以上均为全局变量

print('本月的变动成本是' + str(variable_cost))

def sum_cost():

sum = rent + variable_cost

print('本月的总成本是' + str(sum))

sum_cost()

第二种:global语句

global语句可以将局部变量声明为全局变量

rent = 3000

def cost():

global variable_cost # global语句

utilities = int(input('请输入本月的水电费用'))

food_cost = int(input('请输入本月的食材费用'))

variable_cost = utilities + food_cost

print('本月的变动成本是' + str(variable_cost))

def sum_cost():

sum = rent + variable_cost

print('本月的总成本是' + str(sum))

cost()

sum_cost()

用法:global语句一般写在函数体的第一行,它会告诉Python,“我希望variable_cost是个全局变量,所以请不要用这个名字创建一个局部变量”。所以sum_cost()函数内部现在可以直接使用声明后的全局变量variable_cost。

第三种方法:函数的嵌套

3.2 函数的嵌套

rent = 3000

def cost():

utilities = int(input('请输入本月的水电费用'))

food_cost = int(input('请输入本月的食材费用'))

variable_cost = utilities + food_cost

print('本月的变动成本是' + str(variable_cost))

return variable_cost

def sum_cost():

sum = rent + cost() #函数嵌套

print('本月的总成本是' + str(sum))

sum_cost() # 不需要再调用cost()函数

# div()函数计算并返回利润率

def div(num1, num2):

growth = (num1 - num2) / num2

percent = str(growth * 100) + '%'

return percent

# warning()函数打印出一句提示

def warning():

print('Error: 你确定上个月一毛钱都不赚不亏吗?')

#定义main()函数,函数内嵌套上面两个函数

def main():

while True:

num1 = float(input('请输入本月所获利润'))

num2 = float(input('请输入上月所获利润'))

if num2 == 0:

warning()

else:

print('本月的利润增长率:' + div(num1,num2))

break

main()

代码的执行顺序:

⚠️def语句后的代码块只是封装了函数的功能,如果没有被调用,那么def语句后面的代码永远不会被执行。

四、练习题

4.1 年终奖有多少

题目:眼看要过年了,深夜食堂经营的不错,你打算给员工发奖金犒劳一下。请你定义函数,当输入员工姓名和工作时长两个参数,即可打印出该员工获得多少年终奖。

发放奖金的要求如下:工作时长不满六个月,发放固定奖金500元。

工作时长在六个月和一年之间(含一年),发放奖金120元*月数(如8个月为960元)

工作时长在一年以上,发放奖金180元*月数 (如20个月为3600元)

方法一:

def math(name,time):

if time<6:

money=500

print('工作时长不满六个月,发放固定奖金500元。')

elif time<=12:

money=120*time

print('工作时长%s个月,发放奖金%s元' %(time,money))

else:

money=180*time

print('工作时长%s个月,发放奖金%s元' %(time,money))

math('大聪',14)

方法二:

def bonus(month):

if month < 6:

money = 500

return money

elif 6 <= month <= 12:

money = 120 * month

return money

else:

money = 180 * month

return money

def info(name, month):

gain = bonus(month)

print('%s来了%s个月,获得奖金%s元' % (name, month, gain))

info('大聪',14)

4.2 hellokitty 抽奖器

题目:我们已经有一个hellokitty抽奖器,现在,请你把这个程序封装成一个新的函数。

练习目标:函数的封装和调用

1、hellokitty抽奖器代码:

# 查看注释,运行代码。

import random

import time

# 用random函数在列表中随机抽奖,列表中只有3位候选者。

luckylist = ['海绵宝宝','派大星','章鱼哥']

# random模块中有个随机选取一个元素的方法:random.choice()。

a = random.choice(luckylist) # 从3个人中随机选取1个人。

print('开奖倒计时',3)

time.sleep(1) # 调用time模块,控制打印内容出现的时间

print('开奖倒计时',2)

time.sleep(1)

print('开奖倒计时',1)

time.sleep(1)

# 使用三引号打印hellokitty的头像

image = '''

/\_)o<

| \\

| O . O|

\_____/

'''

print(image) # ……

print('恭喜'+a+'中奖!') # 使用print函数打印幸运者名单

2、分析代码结构,完成函数封装

# 查看注释,运行代码。

import random

import time

# 将抽奖程序封装成函数

def choujiang(q,w,e): # 定义一个抽奖函数,带有3个参数,也就是3位候选人

luckylist = [q,w,e] # 定义一个中奖名单的列表

a = random.choice(luckylist) # 在中奖名单里面随机选择

print('开奖倒计时',3)

time.sleep(1)

print('开奖倒计时',2)

time.sleep(1)

print('开奖倒计时',1)

time.sleep(1)

image = '''

/\_)o<

| \\

| O . O|

\_____/

'''

print(image)

print('恭喜'+a+'中奖!')

choujiang('虚竹','萧峰','段誉') # 调用函数

学习时间:3月27日

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
封装是面向对象编程中的一个重要概念,它主要是指将数据和行为封装在一起,形成一个类,并对外提供接口,隐藏实现细节,保证数据安全性和代码可维护性。 Python中的封装主要通过访问权限控制实现。在Python中,属性和方法都有其对应的访问权限,主要有公有、私有和受保护种。 公有属性和方法可以被类内部和外部访问,私有属性和方法只能在类内部访问,受保护属性和方法也只能在类内部和子类中访问。 下面通过一个例子来说明Python中如何进行封装。 ```python class Person: def __init__(self, name, age): self.__name = name # 私有属性 self.__age = age # 私有属性 def say_hello(self): print("Hello, my name is %s, and I'm %d years old." % (self.__name, self.__age)) def set_age(self, age): if age < 0 or age > 150: print("Invalid age!") else: self.__age = age # 修改私有属性 p = Person("Tom", 20) p.say_hello() # 输出:Hello, my name is Tom, and I'm 20 years old. p.__name # 报错:AttributeError: 'Person' object has no attribute '__name' p.set_age(200) # 输出:Invalid age! ``` 在上面的例子中,我们定义了一个Person类,其中包含了两个私有属性__name和__age,以及一个公有方法say_hello和一个受保护方法set_age。这样,外部就无法直接访问__name和__age属性,只能通过调用say_hello方法来输出实例的信息。同时,set_age方法可以修改私有属性__age,但是它会对输入的年龄进行检查,保证数据的合法性。 可以看出,Python中的封装通过访问权限控制实现,可以保证数据的安全性和代码的可维护性。在实际开发中,我们应该尽量使用封装来保护数据,防止出现意外错误。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值