Python基础之抽象

抽象

什么是抽象

从具体事物中抽出、概括出他们共同的方法、本质属性与关系等,而将个别的、非本质的方面、属性与关系割舍,这种思维过程就叫抽象。(摘自百度百科)

一个人问你去电影院怎么走,你回答说:“向前走十步,左转九十度,再走五步,右转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))
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值