python 基础 02

函数

我们可以把程序中相对独立的功能模块抽取出来这样做的好处一是减少重复代码的编写
二是将来可以重复的使用这些功能模块python中的函数就是代表了这样的功能模块
y = f(x) f 是函数名 x 是自变量 y 是因变量

注意

  1. 如果定义的函数名重复了,则后面定义的函数将更新前面定义的函数

  2. A and B 如果A False,B被短路,B不被执行
    A or B 如果A True,B被短路,B不被执行
    所以A 和 B 位置的不同可能会对执行效率产生明显影响

  3. 一个文件就是一个模块,千万不要在一个模块中有定义很多功能的函数,尽量保证模块功能的单一性

  4. 作用域 - LEGB 尽量减少全局变量的使用

  5. 在定义的函数中不能用print(),用了就表面你的函数只能在命令提示行里面执行,不能在窗口中执行(在做项目时坚决执行)

  1. print('%02d ' % val, end='')  # 把val格式化成两位输出
    
  2. from combination import *       # 导入combination中所有模块
    from combination as com         # 将combination 重命名为com
    from math import gcd            # 系统将用下面combination中后导入的gcd函数
    from combination import is_prime, gcd, lcm, add,is_palindrome
    # 调用函数时若出现重复,则自动取后调入的函数
    # 如果想两个函数同时存在,则不用from导入
    # 直接import combination  和  import math
    # 然后用combination.gcd   和   math.gcd
    

可变参数的函数

def f(*args):
    total = 0
    for val in args:
        total += val
    return total


# 定义了一个可变参数的函数,如果想传入一个列表的每个元素,则在列表名前加上*
mylist = [1, 3, 5, 10, 20]
print(f(*mylist))

作用域

  • python 搜索一个变量的方式是从局部作用域到嵌套作用域再到全局作用域

  • local - Enclosed - Global

  • LEGB

  • 如果想改变搜索范围 可以使用global和 nonloal关键字

  • 在实际编程中一定不要随便使用全局变量

# 在函数外面定义的 a 是一个全局变量
# global variable
a = 100


def foo():
    # local variable
    # 函数内的局部变量 离开foo函数 a 是无法访问的
    a = 200
    print(a)


foo()
print(a)
# 在函数外面定义的 a 是一个全局变量
# global variable
a = 100
b = 'good'


def foo():
    b = 'hello'

    def bar():
        b = 'shit'
        print(a)
        print(b)

    bar()


foo()
print(a)
# 在函数外面定义的 a 是一个全局变量
# global variable
a = 100


def foo():
    global a
    a = 200
    b = 'hello'
    
    def bar():
        global b
        b = 'good'
        print(a)
        print(b)
    
    bar()
    print(b)


foo()
print(a)
# 在函数外面定义的 a 是一个全局变量
# global variable
a = 100


def foo():
    global a
    a = 200
    b = 'hello'

    def bar():
        nonlocal b
        b = 'good'
        print(a)
        print(b)

    bar()
    print(b)


foo()
print(a)

各种函数实例

求阶乘

# 定义求阶乘的函数   将求阶乘的功能抽取出来放到函数中
def f(x):
    y = 1
    for z in range(1, x + 1):
        y *= z
    return y


if __name__ == '__main__':
    m = int(input('m = '))
    n = int(input('n = '))
    # 当需要计算阶乘的时候不用再写循环而是直接调用已经定义好的函数
    # 求C(m,n)
    print(f(m) // f(n) // f(m - n))

求阶乘2

# 阶乘
def foo(n):
    if n==0:
        sun = 1
    else:
        sun = n * foo(n-1)
    return sun

求最大公约数和最小公倍数

# 如果定义的函数名重复了,则后面定义的函数将更新前面定义的函数
from math import sqrt

# 谷歌的文档注释方法
def gcd(x, y):
    """
    计算最大公约数

    parameters:

        x  一个非负整数

        y  一个非负整数

    Returns:

        x, y 的最大公约数

    """
    (x, y) =(y, x) if x > y else (x, y)
    for factor in range(x, 0, -1):
        if x % factor == 0 and y % factor == 0:
            return factor


# 文档注释
def lcm(x, y):
    """
    计算最小公倍数

    :param x:非负整数

    :param y:非负整数

    :return:最小公倍数
    """
    return x * y //gcd(x, y)

短除法求最大公约数

# 最大公约数(短除法)
def bar1(x,y):
    if x > y:
        return bar1(y, x)
    elif y % x == 0:
        return x
    else:
        return bar1(y % x, x)

计算台阶走法

# 有10步台阶,一个小孩每次可以选择一次走1步、2步、3步,问走完这个台阶有几种方法
def bar2(n):
    if n < 0:
        return 0
    elif n == 0:
        return 1
    else:
        return bar2(n - 1) + bar2(n - 2) + bar2(n - 3)

判断素数

# 官方的文档注释方法
def is_prime(num):
    """
    判断素数

    :param num: 非负整数

    :return: 是素数就返回True 否则 返回False
    """
    for j in range(2, int(sqrt(num)) + 1):
        if num % j == 0:
            return False
    return True if num != 1 else False

判断一个数是不是回文数

def is_palindrome(num):
    """
    判断一个数是不是回文数

    :param num: 一个非负整数

    :return:是回文数返回True否则返回False
    """
    temp = num
    total = 0
    while temp > 0:
        total = total * 10 + temp % 10
        temp //= 10
    return num == total

拿21根火柴

21跟火柴,人先拿,拿计算机后,最少1根,最多4根,谁拿到最后一根就算输保证计算机获胜

from random import randint


def is_macth():
    """
    判断谁拿最后一根火柴
    :return: 返回结果
    """
    total = 21
    while total > 0:
        print('总共还有%d根火柴' % total)
        while True:
            peopel = eval(input('请输入你拿的根数'))
            if 0 < peopel <= 4 and peopel <= total:
                break
        total -= 5
        if total > 0:
            print('电脑拿走了%d根火柴' % (5 - peopel))
    print('你拿走了最后一根,你输了')

判断回文字符串

def is_pa(my_str):
    """
    判断回文字符串
    
    :param my_str: 输入的字符串
    
    :return: 是回文字符串返回True,不是返回Fals
    """
    temp = ''
    my_str1 = my_str
    for _ in range(len(my_str)):
        temp += my_str1[-1]
        my_str1 = my_str1[:-1]
    if temp == my_str:
        return True
    else:
        return False

字符串

字节.PNG

字符串常用功能

字符串的所有功能都不直接更改原字符串,而是产生了一个新的字符串赋值给你

help(''.find)
# 不变字符串  相当于str1一直不变,变的是新字符串
str1 = 'hello, world!'
print(len(str1))                # 返回长度
print(str1.capitalize())        # 首字母大写
print(str1.upper())             # 全大写
print(str1)
print(str1.find('or'))          # 查找并返回下标
print(str1.find('shit'))        #查不到返回-1
print(str1.startswith('He'))    # 看是不是He开头
print(str1.startswith('he'))    # 看是不是he开头
print(str1.endswith('!'))       # 看结尾是不是!
print(str1.center(50, '*'))     # 居中 并用*填满50个字符
print(str1.rjust(50, '#'))      # 居左 并用#填满50个字符
# print(str1.index('or'))       # 查找并返回下标
# print(str1.index('shit'))     #查不到直接报错
str2 = 'abc123456'
print(str2[2])          # 取出c
print(str2[2:5])        # 取出 c12  第五个取不到
print(str2[-3:-1])      # 取出 45
print(str2[-1:-3:-1])   # 取出 45
print(str2[:])          # 全取
print(str2[:2])         # 取出ab
print(str2[5:])         # 取出3456
print(str2[::2])        # 隔一个取一个
print(str2[::-1])       # 字符串的倒转
print(str2.isdigit())   # 判断是不是全数字
print(str2.isalpha())   # 判断是不是全字母
print(str2.isalnum())   # 判断只有数字和字母
str3 = '  644148993@qq.com  '
print(str3.rstrip())    # 自动取消右边空格
print(str3.strip())     #自动取消左右两边空格

字符串的实例

制作文字跑马灯效果

# 文字跑马灯效果
def light():
    contain = input('请输入跑马灯文字:')
    while True:
        os.system('cls')
        print(contain)
        time.sleep(0.5)
        contain = contain[1:] + contain[0]

取文件名的后缀名

# 考虑到文件名有 .abc vbg. fig.gei.exe hosts 等情况   还考虑到要不要点:默认不要has_dot=False
def get_suffix(filename, has_dot=False):
    """
    获取文件名的后缀名

    :param filename: 文件名

    :param has_dot: 是否要点(.)

    :return: 后缀名
    """
    pos = filename.rfind('.')
    if 0 < pos < len(filename)-1:
        index = pos if has_dot else pos + 1
        return filename[index:]
    else:
        return ''

生成制定长度的随机验证码

def generate_code(code_len=4):
    '''
    生成由大小字母数字长度确定的随机验证码

    :param code_len: 验证码长度

    :return: 由大小字母数字组成的验证码
    '''
    all_char = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
    last_pos = len(all_char) - 1
    code = ''
    for _ in range(code_len):
        index = randint(0, last_pos)
        code += all_char[index]
    return code

统计掷x个色子y次后各个点数出现的次数

# 掷n个色子一次后掷出来的点数
def bar(n):
    """
    计算n个色子摇一次的点数和

    :param n:色子个数

    :return:n个色子摇一次的点数和
    """
    return 0 if n <= 0 else randint(1, 6) + bar(n - 1)


# 有了列表(容器)我们可以使用1个变量来保存多个数据
# 更为重要的是我们可以使用循环对列表中保存的数据进行操作
def dot(x, y):
    """
    计算x个色子掷y次后每个点数出现的次数

    :param x: 色子个数

    :param y: 掷色子次数

    :return: 利用列表返回每个点数出现的次数
    """
    f = [0] * (6 * x - (x - 1))
    for _ in range(y):
        face = bar(x)
        f[face - x] += 1
    return f

列表

列表的加法

mylist = [x ** 2 for x in range(1, 10)]
mylist = mylist + [20, 30]    # 列表的加法是添加元素
print(mylist)

列表的各种常用方法

# 列表
f = [10, 20, 30, 20, 40, 20, 50]
f1 = ['odlh', 'akdgah', 'idhgjfhgahjghaj', 'ddhgjhhgghh']
# CRUD   Create Read Update Delete
'''
f.append()               # 追加  加到最后
f.insert()               # 插入  需要选择加入的位置(用一定的容错性)
f.clear()                # 清空
f.remove()               # 移除一个数,如果有多个相同元素,则删除开头那个
del f[6]                 # 删除50
print(f.index(40, 2, 5)) # 在2-5里面查找40,并返回索引
f.pop(1)                 # 删除索引为1的元素,默认为删除末尾元素
f.reverse()              # 翻转f
enumerate(f)             # 枚举   并返回索引
f2 = sorted(f1, key=len, reverse=True)   # 对f1按照字符串长度排序,并且为倒序
'''

列表的生成方式

import sys

# 在计算机系统里面:
# 时间和空间是不可调和的矛盾
# 软件和硬件在逻辑上是等效的
def main():
    f = list(range(10))  # 用list 构造器构造一个列表 (最不常用)
    print(f)
    g = [x ** x for x in range(1, 10)]
    # 用列表的生成表达式语法创建列表容器  (生成式)
    # 用这种语法创建列表之后元素已经准备就绪,所以需要较多的内尺空间
    print(g)
    h = [x ** 2 for x in range(1, 100)]
    print(h)
    print(sys.getsizeof(h))
    k = (x ** 2 for x in range(1, 100))
    # (生成器)--->除了把[]改成(),还可以把定义函数的  return  改成  yield
    # 列表生成器  这里得到的不是一个列表 而是一个生成器对象  (生成器)
    # 通过生成器可以获取到数据 它不占用额外的空间存储数据
    # 每次需要数据的时候就通过生成器取数据 当然这需要花费时间
    print(k)
    print(sys.getsizeof(k))   #(计算k占用的内尺)
    for val in k:
        print(val, end='\t')
    print()
    d = [x + y for x in 'ABCD' for y in '1234']
    print(d)

列表相关实例

Fibonacci序列

# fibonacci 序列
# [1, 1, 2, 3, 5, 8, 13, ... ]
a = []
for i in range(20):
    if i >=2:
        a.append(a[i-1] + a[i-2])
    else:
        a.append(1)
print(a)
print(a[18]/a[19])  # 黄金分割
print(a[::-1])      # 切片
print(a)            # a 被操作后没有改变
a.reverse()         # 翻转a
print(a)            # a.reverse() 直接把a改变了


# 生成器方法
def fib(n):
    a, b = 0, 1
    for _ in range(n):
        a, b = b, a + b
        yield a

    
for val in fib(20):
    print(val)
    

方法和函数

def main():
    f = ['orange', 'apple', 'banna', 'cake']
    # python 内置的排序方法默认都是升序(从小到大)
    # 如果希望排序成降序(从大到小)可以通过reverse参数来控制
    # python 中的函数几乎都是没有副作用的函数
    # 调用函数后不会影响传入的参数
    f2  = sorted(f, reverse=True)  # 函数
    print(f)
    print(f2)
    f.sort(reverse=True)   # 方法
    print(f)
    f.reverse()            # 方法
    print(f)
    f3 = list(reversed(f))    # 函数  reversed(f)返回的是一个反转迭代器,需要加lise才能看到反转的列表
    print(f3)

计算最大值最小值和平均数

def my_math():
    """
    计算一个列表的最大值最小值和平均数

    :return: 计算一个列表的最大值最小值和平均数
    """
    scores = [80, 59, 38, 99, 78]
    maxscore = minscore = scores[0]
    total = 0
    for score in scores:
        if score > maxscore:
            maxscore = score
        elif score < minscore:
            minscore = score
        total += score
    print('最小值为%d,最大值为%d,平均值为%.1f' % (minscore, maxscore, total/len(scores)))

按照字符串长度排序

def bar():
    """
    按照字符串长度排序

    :return: 从长到短排序
    """
    o = ['odlh', 'akdgah', 'idhgjfhgahjghaj', 'ddhgjhhgghh']
    f2 = sorted(o, key=len, reverse=True)
    print(f2)

随机返回几组双色球号码

def random_select():
    """
    随机返回一组彩票(双色球)

    :return: 返回一组双色球号码
    """
    red_balls = list(range(1, 34))
    selected_balls = []
    for _ in range(6):
        index = randrange(len(red_balls))
        selected_balls.append(red_balls[index])
        del red_balls[index]
        selected_balls.sort()
    selected_balls.append(randint(1, 16))
    return selected_balls


def display(ball):
    """
    在蓝色前面加上|,并在一位数前补上0

    :param ball: 含一组彩票号码的列表容器

    :return: 在蓝色前面加上|,并在一位数前补上0
    """
    for index, val in enumerate(ball): # enumerate() 枚举   并返回索引
        if index == len(ball) - 1:
            print('| ', end='')
        print('%02d ' % val, end='')
    print()


def cycle():
    """
    返回你需要注数的双色球号码

    :return: 返回你需要注数的双色球号码
    """
    n = int(input('给我摇几注:'))
    for _ in range(n):
        display(random_select())

求次大

# 求次大
def next_max(all_data):
    max_one = max_two = all_data[0]
    for value in all_data:
        if value > max_one:
            max_two = max_one
            max_one = value
        elif max_two < value < max_one:
            max_two = value
    return max_two

约瑟夫环问题

# 约瑟夫环问题:有15个基督教徒和15个非基督教徒坐船去旅游,船坏了,要杀掉15个人其他人才能获救
# 他们决定随机从一个人报数,数到9的就被杀死,结果15个基督教徒都活下来了,问他们是怎么站的?
def die():
    people = [True] * 30
    counter = 0
    index = 0
    number = 0
    while counter < 15:
        if people[index]:
            number += 1
            if number == 9:
                people[index] = False
                counter += 1
                number = 0
        index += 1
        index %= 30
    for person in people:
        print('基' if person else '非', end='')

求去除最高分和最低分后的平均数

# 设计一个函数,去掉一个最高分和一个最低分后求平均数
def arv(list):
    total = 0
    max_value = min_value = list[0]
    for select in list:
        if select > max_value:
            max_value = select
        elif select < min_value:
            min_value = select
    list.remove(min_value)
    list.remove(max_value)
    for now_value in list:
        total += now_value
    return total/len(list)

返回最大分数及名字

# 原来有一个列表,装的是一组学生的名字,现在输入对应学生的成绩,找出最高分和最低分和对应的学生名字
def match(list1):
    list2 = []
    for name in list1:
        score = eval(input('请输入%s的成绩:' % name))
        list2.append(score)
    max_score = max(list2)
    min_score = min(list2)
    my_max, my_min = list2.index(max_score), list2.index(min_score)
    return '%s拥有最高分%d;%s拥有最低分%d' % (list1[my_max], list2[my_max], list1[my_min], list2[my_min], )

python 的坑

# python 的坑   如果静态区有缓存的数字,调用的时候都是引用的静态区的值,不是重新创建的对象
# 在交互式环境中,静态区自动缓存  -5----256
# 在非交互式环境中,静态区自动缓存所有正数
def main2():
    a = 123
    b = 123
    print(id(a))
    print(id(b))
    print(a is b)   # True
    a = -123
    b = -123
    print(id(a))
    print(id(b))
    print(a is b)   # False

内存管理

  • 栈(stack) 堆(heap) 静态区(数据段,只读数据段,代码段)

  • 变量--对象的引用--对象的内存地址 -- 栈

  • 对象--堆--获取更大的存储空间

  • id()函数 和 is运算符 -- 验身份

    import sys
    
    def main1():
        # 栈(stack) 堆(heap) 静态区(数据段,只读数据段,代码段)
        # 变量--对象的引用--对象的内存地址 -- 栈
        # 对象--堆--获取更大的存储空间
        # id()函数 和 is运算符 -- 验身份
        list1 = [x for x in range(1,10)]  # list1 一个对象的地址
        list2 = list1  # list1把对象的地址赋值给list2
        list2[0] = 1000  # list1 和 list2 是同一个列表容器
        print(list1)     # [1000, 2, 3, 4, 5, 6, 7, 8, 9]
        list3 = list1[:] # 只有用切片的方法赋值list3一个新的列表容器
        list3[1] = 1000
        print(list2)     # [1000, 2, 3, 4, 5, 6, 7, 8, 9]
        print(list3)     # [1000, 1000, 3, 4, 5, 6, 7, 8, 9]
        # 可以查看地址,看是不是同一对象
        print(id(list1))
        print(id(list2))
        print(id(list3))
        print(sys.getrefcount(list)) # 得到list引用次数
    

元组 集合 字典

元组内的单个项目不能重新赋值,且同元素的元组创建时间比列表快很多(%timeit),且同元素的元组占用内存空间比列表少很多(getsizeof(a))


timeit2.PNG

集合部分功能

def main():
    list1 = [1, 1, 2, 2, 3, 3]
    print(list1)
    tuple1 = (1, 1, 2, 2, 3, 3)
    print(tuple1)
    set1 = {1, 1, 2, 2, 3, 3}
    print(set1)
    set2 = {1, 3, 5, 7, 9}
    set3 = set1.intersection(set2)   # 集合的交集  set3 = set1 & set2
    print(set3)
    set3 = set1.union(set2)          # 集合的并集  set3 = set1 | set2
    print(set3)
    set3 = set1.difference(set2)     # 集合的差集  set3 = set1 - set2
    print(set3)
    set3 = set2.difference(set1)
    print(set3)
    set3 = set1.symmetric_difference(set2)  # 集合的对称差  set3 = set1 ^ set2
    for val in set2:
        print(val)
    # print(set2[0])        # 集合是无须存储的 没有下标 集合也没有重复元素(去重)
    print(set2.pop())     # pop() 集合pop出来的值是随机的
    if 3 in set2:
        set2.remove(3)
    print(set2)
    print(set2.issubset(set1))   # 子集  set2 <= set1
    print(set2.issuperset(set1)) # 超集  set2 >= set1
    set4 = {1, 2}
    print(set1.issuperset(set4))

集合 列表 元组 相互的转换

def main():
    set1 = {'hello', 'good', 'cfx', 'hello'}
    print(len(set1))            # 3
    x = sorted(set1) 
    print(type(x))              # <class 'list'>
    print(x)                    # ['cfx', 'good', 'hello']
    list1 = list(set1)
    print(list1)                # ['good', 'hello', 'cfx']
    list2 = [1, 2, 3, 1, 2, 4]
    set2 = set(list2)
    print(set2)                 # {1, 2, 3, 4}
    tuple1 = (1, 1, 2, 3, 4, 4)
    list3 = list(tuple1)
    print(list3)                # [1, 1, 2, 3, 4, 4]

字典的部分功能

def main():
    dict1 = {'name': 'cfx', 'age': '24', 'gender': '男'}
    print(dict1['name'])                        # cfx
    print(dict1['age'])                         # 24
    print(dict1['gender'])                      # 男
    dict1['name'] = '王大锤'
    # dict1 += {'tel': '13594793585'}            这个功能不行
    dict1.update(height=172, fav=['吃', '喝'])
    print(dict1.pop('age'))                     # 24
    print(dict1.popitem())                      # ('fav', ['吃', '喝'])
    # del dict1                                 # del减少对象的引用  断开dict1的引用
    del dict1['gender']
    print(dict1)                                # {'name': '王大锤', 'height': 172}
    for x in dict1:
        print(x, '---->',dict1[x])              # key --value
    dict1.setdefault('motto', '成年人的故事太动听')
    print(dict1['motto'])                       # 成年人的故事太动听
    del dict1['motoo']
    print(dict1['motto'])                       # 为空
    dict1.pop('motto')

元组 字典 集合的实例

二维数列的应用

def main():
    names = ['关羽', '张飞', '赵云', '刘备', '孙权']
    subjects = ['语文', '数学', 'python']
    scores = [[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]
    # scores = [[0, 0, 0] for _ in range(5)]
    # scores = [[0] * len(subjects) for _ in range(5)]
    # scores = [[0  for __ in range(3)]  for _ in range(5)]
    '''
    # scores1 = [[0] * len(subjects)] * len(names)
    # print(id(scores1[0])
    # print(id(scores1[1])
    # print(id(scores1[2])    # 都是一个地址,后面乘的5 只是引用了地址5次
    # print(scores)
    '''
    for row,name in enumerate(names):
        for col,subject in enumerate(subjects):
            scores[row][col] = eval(input('请输入%s的%s成绩:' % (names[row], subjects[col])))
    print(scores)

输入年月日判断是当年的第几天

def is_leap(year):
    """
    判断是不是闰年

    :param year: 输入年份

    :return: 是闰年返回True,平年返回False
    """
    return year % 4 == 0 and year % 100 != 0 or year % 400 == 0


def witch_day(year, month, date):
    """
    判断当天是当年的第几天

    :param year:输入的年

    :param month:输入的月

    :param date:输入的日

    :return:返回天数
    """
    leap = [[31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31],
            [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
            ][is_leap(year)]
    # is_leap(year) 返回True时自动取1  返回False时自动取0.
    total = 0
    for index in range(month - 1):
        total += leap[index]
    return total + date


if __name__ == '__main__':
    print(witch_day(2018, 1, 1))    #1
    print(witch_day(2016, 3, 1))    # 61
    print(witch_day(1980, 11, 28))  # 333
    print(witch_day(1981, 12, 31))  # 365

返回杨辉三角(9种方法)

# 1 
# 1 1   
# 1 2   1   
# 1 3   3   1   
# 1 4   6   4   1   
# 1 5   10  10  5   1   
# 1 6   15  20  15  6   1   
# 1 7   21  35  35  21  7   1   


def pascal1(n):
    """
    杨辉三角
    :param n: 行数

    :return: n行杨辉三角
    """
    list1 = [[0 for _ in range(1, p+1)] for p in range(1, n+1)]
    if n <= 0:
        return None
    else:
        for i in range(n):
            if i == 0:
                list1[0][0] = 1
            elif i == 1:
                list1[1][0] = list1[1][1] = 1
            else:
                for j in range(i+1):
                    if j == 0:
                        list1[i][j] = 1
                    elif j == i:
                        list1[i][j] = 1
                    else:
                        list1[i][j] = list1[i - 1][j - 1] + list1[i - 1][j]
    return list1


def display(n):
    for i in range(n):
        for j in range(i+1):
            print(pascal1(n)[i][j], end='\t')
        print()


def pascal2():
    list2 = [1]
    while True:
        yield list2
        list2 = [sum(i) for i in zip([0] + list2, list2 + [0] )]


def pascal3():
    list2 = [1]
    while True:
        yield list2
        list2 = list(map(lambda x, y: x + y, [0] + list2, list2 + [0]))


def pascal4(n):
    list2 = [1]
    while True:
        yield list2
        list2 = [list2[i] + list2[i+1] for i in range(len(list2) - 1)]
        list2.insert(0,1)
        list2.append(1)
        if len(list2) == n:
            break


def pascal5(n):
    for du in range(1, n+1):
        a = [1 for _ in range(du)]
        if 2 < du < n + 1:
            for x in range(du-2):
                a[x+1] = b[x] + b[x+1]
        b = a
        print(a)


def pascal6(n):
    list2 = [1]
    i = 0
    while i < n:
        yield list2
        list2.append(0)
        list2 = [list2[i-1] + list2[i] for i in range(len(list2))]
        i += 1


def pascal7(n):
    list = []
    for _ in range(n):
        for _ in range(len(list) - 1):
            list.append(list.pop(0) + list[0])
        list.append(1)
        print(list)


def pascal8(n):
    i, L = 0,[[1]]
    while i < n:
        yield (L[i])
        list3 = [1] + [L[i][x] + L[i][x+1]  for x in range(0, len(L[i]) - 1)] +[1]
        L.append(list3)
        i += 1


def pascal9(n):
    for i in range(n):
        if i < 2:
            list1 =[1] * (1 + i)
        else:
            list1[1:-1] = [list1[i] + val for i, val in enumerate(list1[1:])]
        print(list1)


if __name__ == '__main__':
    display(8)
    # for val in pascal8(10):
    #     print(val)
    # n = 0
    # for t in pascal4():
    #     print(t)
    #     n += 1
    #     if n == 10:
    #         break
    # pascal9(10)
    # for val in fib(10):
    #     print(val)

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,463评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,868评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,213评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,666评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,759评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,725评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,716评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,484评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,928评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,233评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,393评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,073评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,718评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,308评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,538评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,338评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,260评论 2 352

推荐阅读更多精彩内容

  • http://python.jobbole.com/85231/ 关于专业技能写完项目接着写写一名3年工作经验的J...
    燕京博士阅读 7,566评论 1 118
  • 变量不需要声明 python的变量不需要声明,你可以直接输入: 那么你的内存里就有了一个变量a,它的值是10,它的...
    L小橙子阅读 280评论 0 0
  • 两种算法比较 广度优先搜索一个图的时候是按照树的层次来搜索的,(层次遍历),队列来实现,我们假设一个节点衍生出来的...
    会发光的二极管阅读 15,952评论 0 7
  • 秋天敲打着玻璃 斑驳模糊 坐上一片黄色的枯萎 悠然地飘落 路过的诗人捡起 夹进棕色的怀旧 赤脚印在泥泞的小路 指头...
    康本丛Ben阅读 238评论 0 0
  • 20.1.1尧曰:“咨!尔舜!天之历数在尔躬,允执其中。四海困穷,天禄永终。”舜亦以命禹。——[让位给舜的时候,]...
    共剪西窗烛阅读 837评论 0 0