抽象
什么是抽象
从具体事物中抽出、概括出他们共同的方法、本质属性与关系等,而将个别的、非本质的方面、属性与关系割舍,这种思维过程就叫抽象。(摘自百度百科)
一个人问你去电影院怎么走,你回答说:“向前走十步,左转九十度,再走五步,右转45度,走123步就到了。”然后那个人迷路了。。。。。。倘若你这么告诉他“一直沿着街走,过桥,电影院就在左手边。是不是就一目了然了。
上述说法中,沿着街道走,过桥等就是将详细的步骤抽象为方法。这样就很清晰了。
创建函数
def+函数名+”:”
def语句中函数后面的变量称之为函数的形参,调用函数时提供的值称之为实参。
#实现斐波那契数
def fibs(num):
result=[0,1]
for i in range(num-2):
result.append(result[-2]+result[-1])
return result
print(fibs(8))
参数
参数可以修改吗?
def change(n):
n="Asuna"
name="Saber"
change(name)
print(name)
可以看出来name的值并没有改变。 (因为字符串是不可变类型)
但是将可变的数据结构(比如列表)用作参数的话值是可以改变的。
def change(n):
n[0]="Asuna"
names=["Saber","Polaris"]
change(names)
print(names)
原因是什么呢?
关键字参数和默认值
使用参数名提供的参数叫做关键字参数,其主要作用在于可以明确每个参数的作用。
def store(patient,hour,minu,day,month):
print("patient is :"+"%s"%patient)
print("date is :"+"%d,%d" %(month,day))
print("time is :"+"%d:%d" %(hour,minu))
store(patient="Asunna",hour=10,minu=20,day=13,month=5)
关键字参数可以在函数中给参数提供默认值,当参数具有默认值的时候,调用的时候就不用在提供默认参数了。注意:可以不提供、可以提供一些或者提供所有参数。
def hello(greeting="hello",name="world"):
print("%s,%s!"%(greeting,name))
hello()
hello("Greetings")
hello("Greetings","universe")
hello(name="Asunna")
收集参数
用户给函数提供任意数量的参数
def num(*num):
print(num)
num(1,2,3)
可以看出结果作为元组打印出来了。参数前的星号将所有的值放置在同一个元组之中。即收集其余位置的参数。如果不提供任何供收集的元素,那么就返回一个空元组。
def num(title,*num):
print(title)
print(num)
num("num: ",1,2,3,4)
num("num: ")
用”**”来实现处理关键字参数的“收集”操作。
def num(**keynum):
print(keynum)
num(x=1,y=2,z=3)
返回的是字典而不是元组。
def num(**keynum):
print(keynum)
num(x=1,y=2,z=3)
联合使用上述功能
def num(x,y,z=3,*num,**keynum):
print(x,y,z)
print(num)
print(keynum)
num(1,2,3,5,6,7,foo=1,bar=2)
num(1,2)
#结果为:
# (5, 6, 7)
# {'foo': 1, 'bar': 2}
# 1 2 3
# ()
# {}
作用域
请看下面的代码
def foo():
x=42
x=1
foo()
print(x)
可以观察到上述程序得到的结果是1,也就是说x并没有改变。why?
原因在于x本身是全局变量。每个函数调用都会创建一个新的作用域(局部作用域)。
上述foo函数(重绑定)了变量x,但是最后x并没有改变。这是因为当调用foo的时候,新的命名空间就被创建了,他作用于foo内的代码块。赋值语句x=42只在内部作用域中起作用。并不影响全局作用域中的x。
global(重绑定全局变量)
如果在函数内部将值赋予一个变量,他会自动成为局部变量————除非将其声明为全局变量。即global
x=1
def chang_global():
global x,y,z
x=x+1
chang_global()
print(x)
递归
函数调用自身这种方式就叫做递归。
求阶乘
#非递归版本
def factorial(n):
result = n
for i in range(1,n):
result *= i
return result
#递归版本
def factorial_1(n):
if n == 1:
return n
else:
return n * factorial_1(n-1)
print(factorial(5))
print(factorial_1(5))
二分查找
def search(seq,number,lower=0,upper=None):
if upper is None:
upper=len(seq)-1
if lower==upper:
assert number==seq[upper]
return upper
else:
middle=(lower+upper)//2
if number>seq[middle]:
return search(seq,number,middle+1,upper)
else:
return search(seq,number,lower,middle)
s=[34,67,8,124,4,100,95]
s.sort()
print(search(s,34))