2023年3月

~什么是函数?

!函数是一段具有特定功能的、可重用的语句组,是一种功能的抽象。一般函数表达特定功能。

~它的一般表示形式为:

def <函数名>(参数):

<函数体>

return <返回值>

注意:上面的参数可有可无,但是我们括号一定得有。

示例:

def fact(n):
	s=1
	for i in range(1,n+1):
		s*=i
	return s
print(fact(10))

其中,上面的def ... return 是函数的定义,后面的print(fact(10))是函数的调用

~函数调用

!函数调用是运行函数代码的方式

这里需要指明的地方是:调用的时候需要给出实际参数,然后我们代码运行的时候,实际参数会v替代定义中的形式参数,然后通过最后得到返回值。我们上面那个案例是将返回值输出来了。

!函数定义中的参数,有一部分为可选参数,一部分为非可选参数。函数定义时可以为某些参数指定默认值,构成可选函数;我们可以这样理解,函数定义的时候,有一部分参数是必须要有的,这一部分是不可选参数,有一部分参数是可有可无的,这一部分是可选参数。为了区分,我们需要注意的是可选函数必须放在不可选函数的后面。

!可变参数传递

函数定义的时候,可以设计不确定参数总数量,示例:

def <函数名>(参数,*b):  //b是指不确定参数总数量

<函数体>

return <返回值>

示例:

def fact(n,*a):
	s=1
	for i in range(1,n+1):
		s*=i
	for item in a:
		s*=item
		return s
print(fact(10,3))

!参数传递的两种方式

位置传递与名称传递

~函数的返回值

return 保留字用于传递返回值,函数可以有返回值,也可以没有,返回值数量不定,甚至returrn 可有可无,

!函数的局部变量与全局变量

很好理解,局部变量就是在函数内部有效的变量,全局变量就整个程序都有效。然后,我们需要注意的是:在程序中我们可以使用global 保留字在函数内部使用全局变量:

示例:

n,s=10,100
def fact(n):
	global s #此处s为全局变量
	for i in range(1,n+1):
		s*=i
	return s
print(fact(n),s)

除了使用global 保留字,在局部变量为组合数据类型且未创建,则等同于全局变量,如果它在函数内部被创建了,那么它就是一个局部变量。

示例:

l=["F","f"]
def fun(a):
	l.append(a)
	return 
fun("R")
print(l)
def func(b):
	l=[]
	l.append(b)
	return
func("M")
print(l)

输出结果:

import turtle,time
def drawGap():
	turtle.penup()
	turtle.fd(10)
def drawLine(draw):
	drawGap()
	if draw:
		turtle.pendown()
	else:
		turtle.penup()
	turtle.fd(40)
	drawGap()
	turtle.right(90)
def  drawDigit(digit):
	drawLine(True) if digit in [2,3,4,5,6,8,9] else drawLine(False)
	drawLine(True) if digit in [0,1,3,4,5,6,7,8,9] else drawLine(False)
	drawLine(True) if digit in [0,2,3,5,6,8,9] else drawLine(False)
	drawLine(True) if digit in [0,2,6,8] else drawLine(False)
	turtle.left(90)
	drawLine(True) if digit in [0,4,5,6,8,9] else drawLine(False)
	drawLine(True) if digit in [0,2,3,5,6,7,8,9] else drawLine(False)
	drawLine(True) if digit in [0,1,2,3,4,7,8,9] else drawLine(False)
	turtle.left(180)
	turtle.penup()
	turtle.fd(20)
def drawDate(date):
	turtle.pencolor("red")
	for i in date:
		if i=='-':
			turtle.write('年',font=("Arial",18,"normal"))
			turtle.pencolor("green")
			turtle.fd(40)
		elif i=='=':
			turtle.write('月',font=("Arial",18,"normal"))
			turtle.pencolor("blue")
			turtle.fd(40)
		elif i=='+':
			turtle.write('日',font=("Arial",18,"normal"))
		else:
			drawDigit(eval(i))
def main():
	turtle.setup(800,350,200,200)
	turtle.penup()
	turtle.fd(-300)
	turtle.pensize(5)
	drawDate(time.strftime('%Y-%m=%d+',time.gmtime()))
	turtle.hideturtle()
	turtle.done()
main()

输出结果:

~代码复用与模块化设计

!所谓的代复用,顾名思义,也就说同一份代码在需要的时候可以被重复使用,有两种形式:一个是函数,一个是对象。

!模块化设计,简单地来讲,就是通过函数或对象封装将程序划分为模块及模块间的表达,这样就有了两种关系,一个是主程序与子程序之间的关系,一个是子程序和子程序之间的关系。

在模块化设计的时候,我们需要注意模块内部紧耦合,模块之间松耦合。

~函数递归的理解

!函数递归就是在函数定义中调用函数自身的方式。

!我们在编写函数递归的时候,注意把握链条、基例这两大关键特征。基例就是指那些不需要再次递归的部分,比如我们在编写斐波那契数列的时候,当n=1,n=2时,f(1)=1;f(2)=2,这部分为基例;链条就是其余需要我们在函数中进行递归的部分。

~函数递归的调用过程

!递归的实现:递归就是函数+分支语句

递归本来就是一个函数,需要函数定义的方式进行描述;在函数内部,采用分支语句对输入参数进行判断。

~函数递归的实例:汉诺塔

!  代码如下

count=0
def hanoi(n,src,dst,mid):
	global count
	if n==1:
		print("{}:{}-->{}".format(1,src,dst))
		count+=1
	else:
		hanoi(n-1,src,mid,dst)
		print("{}:{}-->{}".format(n,src,dst))
		count+=1
		hanoi(n-1,mid,dst,src)
hanoi(3,"A","C","B")
print(count)  

汉诺塔的理解方式:

首先我们先假设一个圆盘的形式,那么我们就直接从第一根柱子挪到第三根柱子上面。如果我们有两块以上的圆盘(假设为n),这样我们直接思考第n个圆盘和n-1个圆盘之间的关系,我们会发现他们之间的关系是,将n-1个圆盘放在第二根柱子上,把第n个圆盘放在第三根柱子上,然后再把n-1个圆盘放在第三根柱子上面。其余的步骤就类似了,就是我们只需要考虑n和n-1之间的关系。

~集合类型定义

集合是多个元素的无序组合,集合元素之间无序,且无法修改,不能存在相同的元素

A={"pypy123456",456,"fgh"}
B={"p",123,"p",123}
C=set("pypy12345")
print(A)
print(B)
print(C)

输出结果:

这体现了建立集合类型的方式为{}或set().

~集合操作符

这个和数学中的类似:就是并差交补

操作符及应用

描述

S|=T

并,更新集合S,包括在集合S和T中的所有元素

S-=T

差,更新集合S,包括在集合但是不在T中的元素

S&=T

交,更新集合S,包括同时在集合S和T中的元素

S^=T

补,更新集合S,包括集合S和T中的非相同元素

S|T

并,返回一个新集合,包含S和T中的所有元素

S-T

差,返回一个新集合,包含在S但不在T中的元素

S&T

交,返回一个新集合,包括同时在S和T中的元素

S^T

补,返回一个新集合,包括在S和T中的非相同元素

S>=T或S>T

返回True/False,判断S和T之间的包含关系

S<=T或S<T

返回True/False,判断S和T之间的包含关系

~集合处理方法

A={"pypy123456",456,"fgh"}
B={"p",123,"p",123}
C=set("pypy12345")
print(A)
print(B)
print(C)
A.add("mimi")
print(A)
A.discard(456)
print(A)
A.remove(456)
print(A)
C.clear()
print(B.pop())
print(len(A))
print(123 in B)

上面这段代码,进行了几种集合处理方法的说明,也就是:.add(a)  .discard(a)  .remove(a)  .clear()  .pop()  len()  in等方法的说明。下面是执行结果

上面看出来了,这个结果出错了,这就是在说明一个问题:我们移除集合中的元素的时候,必须得明白:A.discard(x)  A.remove(x)  两个方法的区别,第一个如果x不在A中,是不报错的,第二个是会报错的。

然后我们将.remove这行代码注释掉,执行结果如下(由于本人分两次执行,部分结果可能不一致,朋友们可以自己实验一下):

!我们直接在命令提示符中输入pip install requests.

但是,我们需要注意的是:我们输入这个不一定有效,因为可能会存在不存在pip的情况。

如果说我们碰到了这种情况,然后就去配置环境变量,把python.exe的位置复制到里面去。具体我们可以参考这篇文献:

https://www.pianshen.com/article/75651143400/

!但是,我们可能还会碰上另外一个情况,就是我们接着输入pip install requeats,它不执行。

然后我们这个时候输入python -m pip install requests.等它下载完就好了。

!然后这个时候可能还会出现一种情况,下载到一半,出现一堆红字,这个时候,我们直接把那个下载链接复制一下,自己把那个文件下载下来,然后使用cmd命令安装到本地就好了。