Python自学(四)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/vivien1997/article/details/96373235
※函数与递归函数
#如何判断回文素数
x = 151

is_palin = False
is_prime = False

if str(x)[::-1] == str(x):
    is_palin = True
else:
    print(False)

for i in range(2,x):
    if x % i == 0:
        break;
else:
    is_prime = True

if is_palin and is_prime:
    print("OK")
else:
    print("NO")
该程序虽然可以实现回文素数的判断,但看起来很不直观,解决办法就是构造函数。
调用函数:is_palin( ),is_prime( ),程序为:
num = 11

def is_palin(num):
    if str(num)[::-1] == str(num):
        return True
    else:
        return False

def is_prime(num):
    for i in range(2,num):
        if num % i == 0:
            break;
        else:
            return True

if is_palin(num) and is_prime(num):
    print("YES")
else:
    print("NO")
函数:完成特定功能的一个语句组,这组语句可以作为一个单位使用,并且给它取了一个名字。通过函数名执行
◎定义函数:
关键字 函数   参数
def print_sum(start,stop):                                  //函数头
“””   //三引号
to calculate the sum from start to stop                    //说明文档
””””
result = 0                                           //函数体语句
for i in range(start,stop + 1):
result += i
print(“Sum is”,result)
#return result     函数调用完成后,返回数据,return语句终止当前函数的执行,其后语句将被忽略
◎调用函数:print_sum(1,10)
◎函数-变量作用域
x = 1
def f():
    print(x)
    y = 2
    print(y)
f()
print(x)
print(y)
结果为:1
2
1
Traceback (most recent call last):
  File "D:/苏嵌环境/Python自学/变量作用域.py", line 8, in <module>
    print(y)
NameError: name 'y' is not defined
局部变量:只能在程序的特定部分使用的变量
全局变量:为整个程序使用的变量
x = 1

def f1():
    x = 2
    print(x)
f1()
print(x)
结果为  2
1
改变后:
x = 1

def increase():
    global x                     //将变量转化为全局变量
    x += 1
    print(x)

increase()
print(x)
结果为  2
2
※函数的优点:
1、代码可重复使用:提高开发效率,减少重复编码
2、代码更简洁:函数功能相对独立,功能单一,结构清晰,可读性好
3、编程更容易把握:复杂程序分解成较小部件
4、封装与信息隐藏
◎打印给定年给定月份的日历

def is_leap_year(year):
    if year % 4 == 0 and year % 100 != 0 or year % 400 == 0:
        return True
    else:
        return False

def get_num_of_days_in_month(year,month):
    if month in(1,3,5,7,8,10,12):
        return 31
    elif month in(4,6,9,11):
        return 30
    elif is_leap_year(year):
        return 29
    else:
        return 28
        

def get_total_num_of_day(year,month):
    days = 0
    for y in range(1800,year):
        if is_leap_year(y):
            days += 366
        else:
            days += 365

    for m in range(1,month):
        days += get_num_of_days_in_month(year,m)
    return days

def get_start_day(year,month):
    return (3 + get_total_num_of_day(year,month)) % 7

print(get_start_day(2033,12))

※递归函数
递归:程序调用自身	
形式:在函数定义有直接或间接的调用自身
◎阶乘
#递归方式实现
def p(n):
    if n == 1 or n == 0:
        return 1
    else:
        return n * p(n - 1)

print(p(3))
递归解决问题的思想
if:问题足够简单:直接解决问题,返回解。
else:将问题分解为与原问题同构的一个或多个更多的问题,逐个解决这些更小的问题,将结果组合,获得最终的解,返回解。
◎兔子数列(斐波那契数列):1,1,2,3,5,8,13,21,34,55
def fib(n):
    if n == 1 or n == 2:
        return 1
    return fib(n - 1) + fib(n - 2)

print(fib(8))
◎汉诺塔:将前n-1个盘子,通过C,从A移动到B,从A到C移动第n个盘子,将前n-1个盘子,通过A,从B移动到C
定义函数hanoi(n,A,B,B)表示把A上的n个盘子移动到C上,其中可以用到B
count = 0
def hanoi(n,A,B,C):
    global count
    if n == 1:
        print("Move disk",n,"from",A,"to",C)
        count += 1
    else:
        hanoi(n - 1,A,C,B)
        print("Move disk",n,"from",A,"to",C)
        count += 1
        hanoi(n - 1,B,A,C)

hanoi(3,'Left','Mid','Right')
print("count = ",count)
结果为:
Move disk 1 from Left to Right
Move disk 2 from Left to Mid
Move disk 1 from Right to Mid
Move disk 3 from Left to Right
Move disk 1 from Mid to Left
Move disk 2 from Mid to Right
Move disk 1 from Left to Right
count =  7
◎路边停车
import random                    #引入随机函数
def parking(low,high):
    if high - low < 1:
        return 0
    else:
        x = random.uniform(low,high - 1)   #随机停入一个位置
        return parking(low,x) + 1 + parking(x + 1,high)
s = 0
for i in range(10000):             #平均10000次后可以停的车的辆数
    s += parking(0,5)
print(s / 10000)
◎递归的优劣分析:
优点:可以使一个蕴含递归关系且结构复杂的程序简洁精炼,特别在难于找到从边界到解的全过程的情况下,如果把问题推进一步,其结果仍维持原问题的关系
缺点:嵌套层次深,函数调用开销大,重复计算,时间效率低
◎小程序测试题:
'''
def fib(n):
    f1,f2 = 0,1
    while f2 < n:
        print(f2)
        f1,f2 = f2,f1 + f2
fib(10)                         #1 1 2 3 5 8
'''
'''
def foo():
    m = 1
    def bar():
        n = 2
        return m + n
    m = bar()
    print(m)
foo()                          #m = 3
'''
def gcd(m,n):
    r = m % n
    if r == 0:
        return n
    else:
        r = m % n
    return gcd(n,r)
print(gcd(15,36))      # n = 3       

猜你喜欢

转载自blog.csdn.net/vivien1997/article/details/96373235
今日推荐