Python函数定义以及常用数据结构

学习汇总

1.函数

函数就是把常见的功能封装成一部分,以便重复使用的代码片段。我们需要注意的是:函数尽管定义了,只要不调用该函数,那么这个函数就不会执行。以下就是一个函数的代码片段:

def f(x):
    """
    计算x的阶乘

    :param x: 一个非负整数
    :return: 阶乘
    """
    y = 1
    for number in range(1, x + 1):
        y *= number
    return y

if __name__ == '__main__':
    print(f(20))

这是一个求阶乘的函数从函数中,我们观察到一个完整的函数有以下几个方面

函数的定义

函数定义一次可以调用无限次,函数定义以def开头,紧接着就是函数名,()里面的是参数,这里的参数相当于数学函数的自变量,参数类型可是任意的。定义函数的时候需要注意函数名命名规则跟变量的命名规则是一致的,多个函数名之间不能重复。关键字return表示返回一个值,相当于数学上函数的因变量,用于退出函数。

函数的参数

函数是绝大多数编程语言中都支持的一个代码的“构建块”,但Python对函数参数的处理与其他编程语言是不一样的。在Python中,函数的参数可以有默认值,也支持使用可变参数,所以Python并不需要像其他语言一样支持函数的重载,因为我们在定义一个函数的时候可以让它有多种不同的使用方式,可以对函数参数设定默认值。在函数调用的时候,如果没有指定参数,那么就使用函数的默认值,若指定参数,则使用的是指定的参数,以下举个例子:

from random import randint


def roll_dice(n=2):
    """
    摇骰子

    :param n: 骰子的个数
    :return: n颗骰子点数之和
    """
    total = 0
    for _ in range(n):
        total += randint(1, 6)
    return total


def add(a=0, b=0, c=0):
    return a + b + c


# 如果没有指定参数那么使用默认值摇两颗骰子
print(roll_dice())
# 摇三颗骰子
print(roll_dice(3))
print(add())
print(add(1))
print(add(1, 2))
print(add(1, 2, 3))
# 传递参数时可以不按照设定的顺序进行传递
print(add(c=50, a=100, b=200))

字符串和常用数据结构

字符串

字符串(String)是由数字、字母、下划线组成的一串字符。一般记为 s=“a1a2···an”(n>=0)。它是编程语言中表示文本的数据类型。在程序设计中,字符串(string)为符号或数值的一个连续序列,如符号串(一串字符)或二进制数字串(一串二进制数字)。
通常以串的整体作为操作对象,如:在串中查找某个子串、求取一个子串、在串的某个位置上插入一个子串以及删除一个子串等。两个字符串相等的充要条件是:长度相等,并且各个对应位置上的字符都相等。设p、q是两个串,求q在p中首次出现的位置的运算叫做模式匹配。串的两种最基本的存储方式是顺序存储方式和链接存储方式。

字符串的使用

在Pyhton中字符串的使用大概有以下几个方面:

def main():
    str1 = 'hello, world!'
    # 通过len函数计算字符串的长度
    print(len(str1))  # 13
    # 获得字符串首字母大写的拷贝
    print(str1.capitalize())  # Hello, world!
    # 获得字符串变大写后的拷贝
    print(str1.upper())  # HELLO, WORLD!
    # 从字符串中查找子串所在位置
    print(str1.find('or'))  # 8
    print(str1.find('shit'))  # -1
    # 与find类似但找不到子串时会引发异常
    # print(str1.index('or'))
    # print(str1.index('shit'))
    # 检查字符串是否以指定的字符串开头
    print(str1.startswith('He'))  # False
    print(str1.startswith('hel'))  # True
    # 检查字符串是否以指定的字符串结尾
    print(str1.endswith('!'))  # True
    # 将字符串以指定的宽度居中并在两侧填充指定的字符
    print(str1.center(50, '*'))
    # 将字符串以指定的宽度靠右放置左侧填充指定的字符
    print(str1.rjust(50, ' '))
    str2 = 'abc123456'
    # 从字符串中取出指定位置的字符(下标运算)
    print(str2[2])  # c
    # 字符串切片(从指定的开始索引到指定的结束索引)
    print(str2[2:5])  # c12
    print(str2[2:])  # c123456
    print(str2[2::2])  # c246
    print(str2[::2])  # ac246
    print(str2[::-1])  # 654321cba
    print(str2[-3:-1])  # 45
    # 检查字符串是否由数字构成
    print(str2.isdigit())  # False
    # 检查字符串是否以字母构成
    print(str2.isalpha())  # False
    # 检查字符串是否以数字和字母构成
    print(str2.isalnum())  # True
    str3 = '  jackfrued@126.com '
    print(str3)
    # 获得字符串修剪左右两侧空格的拷贝
    print(str3.strip())


if __name__ == '__main__':
    main()

列表

List是Python内置的一种数据类型列表。Python中的列表与其它语言(C/C++/Java)的数组是不一样的,其它只能存储一种数据类型的数据,但是Python的列表可以存储多种,列表里可以继续存储列表。

列表的使用

以下使列表的使用的代码示例

def main():
    list1 = [1, 3, 5, 7, 100]
    print(list1)
    list2 = ['hello'] * 5
    print(list2)
    # 计算列表长度(元素个数)
    print(len(list1))
    # 下标(索引)运算
    print(list1[0])
    print(list1[4])
    # print(list1[5])  # IndexError: list index out of range
    print(list1[-1])
    print(list1[-3])
    list1[2] = 300
    print(list1)
    # 添加元素
    list1.append(200)
    list1.insert(1, 400)
    list1 += [1000, 2000]
    print(list1)
    print(len(list1))
    # 删除元素
    list1.remove(3)
    if 1234 in list1:
        list1.remove(1234)
    del list1[0]
    print(list1)
    # 清空列表元素
    list1.clear()
    print(list1)


if __name__ == '__main__':
    main()

元组

Python的元组与列表类似,不同之处在于元组的元素不能修改。元组使用小括号,列表使用方括号。元组创建很简单,只需要在括号中添加元素,并使用逗号隔开即可。

def main():
    # 定义元组
    t = ('张三', 38, True, '四川成都')
    print(t)
    # 获取元组中的元素
    print(t[0])
    print(t[3])
    # 遍历元组中的值
    for member in t:
        print(member)
    # 重新给元组赋值
    # t[0] = '王大锤'  # TypeError
    # 变量t重新引用了新的元组原来的元组将被垃圾回收
    t = ('王大锤', 20, True, '云南昆明')
    print(t)
    # 将元组转换成列表
    person = list(t)
    print(person)
    # 列表是可以修改它的元素的
    person[0] = '李小龙'
    person[1] = 25
    print(person)
    # 将列表转换成元组
    fruits_list = ['apple', 'banana', 'orange']
    fruits_tuple = tuple(fruits_list)
    print(fruits_tuple)


if __name__ == '__main__':
    main()

集合

在 Python 中,集合由内置的 set 类型定义。要创建集合,需要将所有项(元素)放在花括号({})内,以逗号(,)分隔。集合可以有任意数量的元素,它们可以是不同的类型(例如:数字、元组、字符串等)。但是,集合不能有可变元素(例如:列表、集合或字典)。Python中的集合跟数学上的集合是一致的,可以进行交集、并集、差集等运算。集合的使用见以下代码:

def main():
    set1 = {1, 2, 3, 3, 3, 2}
    print(set1)
    print('Length =', len(set1))
    set2 = set(range(1, 10))
    print(set2)
    set1.add(4)
    set1.add(5)
    set2.update([11, 12])
    print(set1)
    print(set2)
    set2.discard(5)
    # remove的元素如果不存在会引发KeyError
    if 4 in set2:
        set2.remove(4)
    print(set2)
    # 遍历集合容器
    for elem in set2:
        print(elem ** 2, end=' ')
    print()
    # 将元组转换成集合
    set3 = set((1, 2, 3, 3, 2, 1))
    print(set3.pop())
    print(set3)
    # 集合的交集、并集、差集、对称差运算
    print(set1 & set2)
    # print(set1.intersection(set2))
    print(set1 | set2)
    # print(set1.union(set2))
    print(set1 - set2)
    # print(set1.difference(set2))
    print(set1 ^ set2)
    # print(set1.symmetric_difference(set2))
    # 判断子集和超集
    print(set2 <= set1)
    # print(set2.issubset(set1))
    print(set3 <= set1)
    # print(set3.issubset(set1))
    print(set1 >= set2)
    # print(set1.issuperset(set2))
    print(set1 >= set3)
    # print(set1.issuperset(set3))


if __name__ == '__main__':
    main()

字典

字典是另一种可变容器模型,类似于我们生活中使用的字典,它可以存储任意类型对象,与列表、集合不同的是,字典的每个元素都是由一个键和一个值组成的“键值对”,键和值通过冒号分开。下面的代码演示了如何定义和使用字典。

def main():
    scores = {'李四': 95, '白元芳': 78, '狄仁杰': 82}
    # 通过键可以获取字典中对应的值
    print(scores['张三'])
    print(scores['狄仁杰'])
    # 对字典进行遍历(遍历的其实是键再通过键取对应的值)
    for elem in scores:
        print('%s\t--->\t%d' % (elem, scores[elem]))
    # 更新字典中的元素
    scores['白元芳'] = 65
    scores['诸葛王朗'] = 71
    scores.update(冷面=67, 方启鹤=85)
    print(scores)
    if '武则天' in scores:
        print(scores['武则天'])
    print(scores.get('武则天'))
    # get方法也是通过键获取对应的值但是可以设置默认值
    print(scores.get('武则天', 60))
    # 删除字典中的元素
    print(scores.popitem())
    print(scores.popitem())
    print(scores.pop('李四', 100))
    # 清空字典
    scores.clear()
    print(scores)


if __name__ == '__main__':
    main()

习题1

输入一个数,判断是否是回文数

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

if __name__ == '__main__':
    print(is_palindrome(123321))

习题2

人机猜数

def main():
    answer = randint(1, 100)
    counter = 0
    while True:
        thy_answer = int(input('请输入:'))
        counter += 1
        if thy_answer < answer:
            print('大一点')
        elif thy_answer > answer:
            print('小一点')
        else:
            print('恭喜你猜对了')
            break
    if counter > 7:
        print('智商捉急!')


if __name__ == '__main__':
    main()

习题3

21根火柴, 轮流拿,(人先拿,计算机后拿,最少拿1根,最多拿4根),谁拿到最后一根就算输.

def main():
    total = 21
    while total > 0:
        print('还剩%d根火柴' % total)
        while True:
            num = int(input('拿几根火柴:'))
            if 1 <= num <= 4 and num <= total:
                break
        total -= num
        if total > 0:
            print('计算机拿走%d根火柴' % (5 - num))
            total -= 5 - num
    print('你拿走了最后一根火柴,你输了!')


if __name__ == '__main__':
    main()

from random import randint


def main():
    total = 21
    while total > 0:
        print('还剩%d根火柴' % total)
        while True:
            num = int(input('拿几根火柴:'))
            if 1 <= num <= 4 and 1 <= num <= total:
                break
        total -= num
        if total > 0:
            com = randint(1, min(4, total))
            print('计算机拿走%d根火柴' % com)
            total -= com
            if total == 0:
                print('计算机拿到最后一根火柴,你赢了!')
        else:
            print('你拿走了最后一根火柴,你输了!')


if __name__ == '__main__':
    main()


def match():
    remain = 21
    while True:
        player = randint(1, min(4, remain))
        remain -= player
        print('玩家拿走%d,剩下%d' % (player, remain))
        if remain == 0:
            print('电脑赢!')
            break
        computer = randint(1, min(4, remain))
        remain -= computer
        print('电脑拿走%d,剩下%d' % (computer, remain))
        if remain == 0:
            print('玩家赢!')
            break


if __name__ == '__main__':
    main()

习题4

import random


def get_suffix(filename, has_dot=False):
    pos = filename.rfind('.')
    # rfind从右往左找
    if 0 < pos < len(filename) - 1:
        index = pos if has_dot else pos + 1
        return filename[index:]
    else:
        return ''

if __name__ == '__main__':
    print(get_suffix('hello.py'))

习题5

def generate_code(code_len=4):
    """
    生成指定长度的验证码

    :param code_len:验证码的长度
    :return: 验证码
    """
    all_chars = '0123456789qwertyuioplkjhgfdsazxcvbnmQWERTYUIOPLKJHGFDSAZXCVBNM'
    chars_len = len(all_chars) - 1
    code = ''
    for _ in range(code_len):
        index = random.randint(0, chars_len)
        code += all_chars[index]
    return code

if __name__ == '__main__':
    print(generate_code())

习题6

def main():
    scores = [95, 78, 62, 99, 45, 32, 80]
    min_score = max_score = scores[0]
    total =0
    for score in scores:
        if score > max_score:
            max_score = score
        elif score < min_score:
            min_score = score
        total += score
    print('%d,%d,%.2f' % (max_score, min_score, total/len(scores)))


if __name__ == '__main__':
    main()

习题7

def second_max(x):
    (m1, m2) = (x[0], x[1]) if x[0] > x[1] else (x[1], x[0])
    for index in range(2, len(x)):
        if x[index] > m1:
            m2 = m1
            m1 = x[index]
        elif x[index] > m2:
            m2 = x[index]
    return m1, m2

def second_number():
    my_list = [35, 79, 92, 11, 68, 55, 40]
    print()
    print(second_max(my_list))

if __name__ == '__main__':
    second_number()

习题8

def main():
    persons = [True] * 30
    counter = 0
    index = 0
    number = 0
    while counter < 15:
        if persons[index]:
            number += 1
            if number == 9:
                persons[index] = False
                counter += 1
                number = 0
        index += 1
        index %= 30
        #上式等价于 if (index ==30 ): index = 0
    for person in persons:
        print('基' if person else '非', end=' ')


if __name__ == '__main__':
    main()

习题9

def student():
    names = ['关羽', '张飞', '赵云', '马超', '貂蝉']
    subjects = ['语文', '数学', 'python']
    table = []
    for row, name in enumerate(names):
        print('输入%s的成绩:' % name)
        scores = []
        for col, subject in enumerate(subjects):
            score = int(input('%s:' % subject))
            scores.append(score)
        table.append(scores)
    print(table)


def student1():
    names = ['关羽', '张飞', '赵云', '马超', '貂蝉']
    subjects = ['语文', '数学', 'python']
    table = [[0 for _ in range(3)] for _ in range(5)]
    for row, name in enumerate(names):
        print('输入%s的成绩:' % name)
        for col, subject in enumerate(subjects):
            score = int(input('%s:' % subject))
            table[row][col] = score
    print(table)


if __name__ == '__main__':
    student()
    student1()

习题10

def day_numbers(year, month, day):
    days_of_month = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
    total = 0
    for index in range(month - 1):
        total += days_of_month[index]
    if month > 2 and is_leap_year(year):
        return total + day + is_leap_year(year)


def which_day(year, month, date):
    days_of_month = [
        [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(year)]
    total = 0
    for index in range(month - 1):
        total += days_of_month[index]
    if month > 2 and is_leap_year(year):
        return total + date


if __name__ == '__main__':
    print(day_numbers(2016, 3, 1))
    print(which_day(1980, 11, 28))

习题11

from random import randrange, randint


def random_select():
    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(balls):
    for index, ball in enumerate(balls):
        if index == len(balls) - 1:
            print('|', end=' ')
        print('%02d' % ball, end=' ')
    print()


def main():
    n = int(input('机选几注:'))
    for _ in range(n):
        display(random_select())


if __name__ == '__main__':
    main()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值