我的世界python造房子_《我的世界》Python编程入门(9) 使用函数建造房子

本文介绍了Python中的函数概念,包括函数在数学中的定义和Python中的实现,强调了函数的定义和调用。通过示例展示了如何定义和调用函数,以及函数的参数类型,如位置参数、默认参数。此外,还讨论了变量的作用域,包括局部变量和全局变量的使用。最后,提供了一个综合案例,展示了如何使用函数在《我的世界》游戏中自定义建造房屋。
摘要由CSDN通过智能技术生成

一、函数的基本概念

1.1 函数在数学中的概念

函数指一个量随着另一个量的变化而变化。

函数的数学形式:y=f(x)

f是一种定义好的关系,可以简称为函数,在函数f中,只要x值的确定,那么y的值一定是确定的。y的值随x值的变化而变化。

1.2 Python中的函数

函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。

Python中函数可以分为内置函数和自定义函数。

前面课程用到的print()和input()也是函数,只不过是内置函数,即系统已经事先定义好的函数。

在大多数情况下,我们需要根据自己的需要自定义函数。

自定义函数的基本语法格式

def 函数名(参数列表):

函数体

return 返回值

自定义函数由def关键字、函数名、参数列表、函数体、返回值五部分组成。

def关键字必备

函数名必备,函数名除满足标识符的基本要求外,注意不要跟系统关键字、内置函数冲突(初学者最容易出现的问题)。

参数列表中 ()不能省略。参数是可选的!Python函数参数形式较多,这也是函数学习中的难点!

函数体可选,函数体即函数执行的功能代码。

return语句为可选项,return语句后面的表达式或值就是返回值,即函数被调用后返回的一个变量。如果没有return语句,返回值为None,即空对象。

注意!函数体和return至少存在一个,不能同时没有两者

思考:通过函数定义的格式学习,今后用到某些函数、方法的时候,应当注意哪些事项?

案例1:定义函数、调用函数

#定义函数

def hello():

print("你好!")

return 1

#调用函数

hello()

程序运行结果为:

你好!

案例分析

该案例可分为函数定义和函数调用两个部分。

函数定义部分

我们定义了一个函数,其中:

函数名为hello

参数列表为(),即没有参数

函数体为print(“你好!”)

返回值为1

调用函数部分

调用函数的基本格式为:函数名()

注意区分函数的返回值和函数的执行结果!

问题

在本案例中函数的执行结果是什么,返回值是什么?

函数的执行结果是函数调用后一定能得到的结果!

返回值在函数被调用后产生,但是我们只有接收使用时,才能感受到它的存在!

练习一:

试一试运行以下代码,分析下结果中哪些是运行hello函数的执行结果,哪些时函数的返回值。

def hello():

print("你好!")

return 1

print(hello())

1.3 编写函数的优势

函数的使用可以重用代码,提搞代码的重复利用率。即一次定义,多次调用。

函数能够封装内部实现,使用者不用关心函数内部实现,只需要知道这个函数怎么用即可。例如:我们买汽车,通常不是买一堆零件自己组装,而是买的厂家直接“封装”好的汽车。我们只管使用汽车,不用关心汽车是如何生产的。

函数可以有效组织代码,使程序模块化,便于程序的阅读、调用、修改和完善。

二、函数的参数

在前面的例子中,函数的参数列表为空,也就是没有参数,函数的执行结果是固定的,不能随着参数变化而变化。

下面我们就通过一系列例子来感受下函数参数的应用!

2.1 形参、实参

案例2:简单的带参数的函数

def cacl(a, b):

result = a*10 + b

return result

print(cacl(1,2))

print(cacl(2,1))

如果有多个参数,参数用 , 隔开。

注意形参(parameter)、实参(argument)的区别

定义函数时的参数 形参,调用函数时用的值 实参

在本案例中,a、b是形参,1、2是实参。

形参即形式参数,实参即实际的参数。

2.2 位置参数

函数参数常用的传递方式有位置参数和默认参数。

位置参数,也叫必传参数、顺序参数,在所有参数中是最重要的。也是在调用函数时必须明确提供的参数!位置参数必须按先后顺序,一一对应,参数个数不能多也不能少。

例如案例3,定义时有2个参数a、b,如果调用时我们用

calc(1),即只用1个参数,程序就会出错

2.3 默认参数

在函数定义时,可以给参数设定一个默认值,那么这个参数就是默认参数,不再是位置参数了。调用函数时,可以给默认参数设定一个值,如果不写默认参数,默认参数自动取默认值。

案例3:默认参数

def chengji(x, n=3):

return x*n

res1 = chengji(2,n=4)

res2 = chengji(2)

res3 = chengji(2,5)

print(res1, res2, res3)

默认情况下,参数值和参数名称是按函数声明中定义的顺序匹配起来的。

2.4 参数定义及调用顺序

函数参数定义的顺序规则:位置参数在前,默认参数在后

函数参数调用(即实参)顺序:位置参数按在前,按位置取值;默认参数位置可调整,指定参数名称时按参数名称取值,未指定名称时,按参数定义顺序取值。

练习二:函数参数定义及调用顺序

def test1(a,b,c=1,d=2):

print(a,b,c,d)

#test1函数按顺序输出a,b,c,d四个变量的值,运行以下函数调用语句,体会参数调用顺序。

test1(1,2)

test1(1,2,d=3,c=2)

test1(1,2,d=4)

test1(1,2,3)

三、变量的作用域

变量的作用域非常重要,用于了解程序中变量是否有效。

在函数内定义的变量叫做局部变量(local variable),只在函数内部有效。

在全局(可以简单的认为定义在函数外)定义的变量叫做全局变量(global variable),在整个程序中都有效。

案例:局部变量

def c():

d =2

c()

print(d)

案例分析

我们在函数c中定义了变量d,d为局部变量,只能在函数内部使用,执行函数c后,打印变量d结果为

Traceback (most recent call last):

File "c:/Users/Administrator/Desktop/111.py", line 13, in

print(d)

NameError: name 'd' is not defined

print(d)是在函数外调用d,变量d出了函数的作用域!

案例:全局变量

a=1

def c():

d = 2

print(a + d)

c()

案例分析

本案例先定义了全局变量a,然后在函数c中定义了局部变量d,在函数中计算a+d的值并打印输出,最后执行函数c。结果为

3,说明全局变量a在函数内也可以使用。

案例:全局变量进阶

运行这两个程序,对比下结果!

#程序1

a = 1

def b():

a = 2

b()

print(a)

#程序2

a = 1

def b():

global a

a = 2

b()

print(a)

案例分析

在函数内部,如果局部变量与全局变量变量名一样,则优先调用局部变量。如果全局变量是不可变对象,在函数内部改变全局变量,需要在前面加上global关键字,在执行函数之后,全局变量值也会改变。

给变量命名时一定要想清楚:变量是否需要全局访问,如不需要,避免在函数等局部作用域中定义同名的变量。

练习三:计算阶乘

写一个函数,实现功能为传入一个大于1的整数n,求123*…*n的结果,并返回。(求阶乘)

def factorial(x):

result = 1

for i in range(1,x+1):

return result

print(factorial(5))

四、综合案例:使用函数建造房子

要求设计一个函数实现自定义建造房子,可以设置建造房子的位置和大小!

案例分析

原案例根据玩家坐标确定建造位置,玩家坐标可以设置为其它任意坐标。原案例大小根据size变量确定,可以修改该变量改变房子大小。

因此,函数的参数可以设置4个,前3个为xyz坐标,最后一个设置为大小,默认为20。

代码实现

import mcpi.minecraft as minecraft

import mcpi.block as block

#先导入所需模块,然后连接游戏

mc = minecraft.Minecraft.create()

#size表示所建房屋的大小,改变size可以改变房子的大小

size = 20

#获取玩家所在坐标点

pos = mc.player.getTilePos()

x=pos.x

y=pos.y

z=pos.z

def create_house(x, y, z, size=20):

'''

x,y,z为建造房子的基准坐标点

size为房屋大小

'''

#midx、midy为正面方向房子在x、y轴上的中间点,便于计算窗户和门的坐标

#如果房子大小改变,窗户、门的位置也会随之变化

midx = x + size/2

midy = y + size/2

#根据size建造一个实心立方体

mc.setBlocks(x, y, z, x+size, y+size, z+size, block.COBBLESTONE.id)

#将立方体的内部掏空

mc.setBlocks(x+1, y, z+1, x+size-1, y+size-1, z+size-1, block.AIR.id)

#实现门,midx代表了x轴坐标的中间位置

mc.setBlocks(midx-1, y, z, midx+1, y+3, z, block.AIR.id)

#填充玻璃窗户

mc.setBlocks(x+3, y+size-3, z, midx-3, midy+3, z, block.GLASS.id)

mc.setBlocks(midx+3, y+size-3, z, x+size-3, midy+3, z, block.GLASS.id)

#使用木材方块建造一个屋顶

mc.setBlocks(x, y+size, z, x+size, y+size, z+size, block.WOOD.id)

#在房子内增加一个羊毛地毯

mc.setBlocks(x+1, y-1, z+1, x+size-1, y-1, z+size-1, block.WOOL.id)

create_house(x,y,z)

小结

函数定义:注意函数定义的各个组成部分

函数的参数:

注意形参、实参的区别

注意各类参数定义与调用的顺序

变量作用域:注意变量定义的位置

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值