函数和模块的使用
将计算阶乘的功能封装到一个称之为“函数”的功能模块中,在需要计算阶乘的地方,只需要“调用”这个“函数”就可以了。
定义函数:
使用def关键字来定义函数,后面加函数名,一般都是通俗易懂,见名知意的名字,命名规则与变量的命名规则一样,在函数名候命的括号中加传递给函数的参数。中间是函数的执行体,用来计算需要的东西,最后通过return来返回一个结果,return可加可不加。
计算阶乘:
def factorial(num):
result = 1
    for n in range(1, num + 1):
        result *= n
    return result
 m = int(input('m = '))
n = int(input('n = '))
函数的参数:
Python中,函数的参数可以有默认值,也支持使用可变参数,所以Python并不需要向其他语言一样支持函数的重载,因为在定义一个函数的时候可以让它有多种不同的使用方式。
摇骰子
from random import randint
def roll_dice(n=2):
 total = 0
    for _ in range(n):
        total += randint(1, 6)
    return total
def add(a=0, b=0, c=0):
    return a + b + c
在参数名前面的*表示args是一个可变参数
 
即在调用add函数时可以传入0个或多个参数
 
def add(*args):
 
    total = 0
 
    for val in args:
 
        total += val
 
    return total
 
print(add())
 
print(add(1))
 
print(add(1, 2))
 
print(add(1, 2, 3))
 
print(add(1, 3, 5, 7, 9))
用模块管理函数:
给函数命名时,有可能会遇到命名冲突的问题,最简单的就是在同一个.py的文件中定义两个同名函数,由于python没有函数重载的概念,那么后面的定义会覆盖之前的定义,也就意味着两个同名函数实际上只存在一个。def foo():
    print('hello, world!')
 
def foo():
    print('goodbye, world!')
两个同名函数结果输出的只有goodbye,world。
Python中每个文件代表了一个模块,在不同的模块中可以有相同的函数名,在使用函数的时候可以通过import关键字导入指定的模块就可以区分到底要使用哪个模块中的函数。
如果我们导入的模块除了定义函数之外还中有可以执行代码,那么Python解释器在导入这个模块时就会执行这些代码,事实上我们可能并不希望如此,因此如果我们在模块中编写了执行代码,最好是将这些执行代码放入如下所示的条件中,这样的话除非直接运行该模块,if条件下的这些代码是不会执行的,因为只有直接执行的模块的名字才是“main”。
字符串和常用数据结构:
Python表示文本信息的方式就是字符串类型,所谓**字符串**,就是由零个或多个字符组成的有限序列
字符串的使用方法:
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())
除了字符串,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)
生成器: 
f = (x ** 2 for x in range(1, 1000))
    print(sys.getsizeof(f))  # 相比生成式生成器不占用存储数据的空间
    print(f)
    for val in f:
        print(val)
Python中还有另外一种定义生成器的方式,就是通过`yield`关键字将一个普通函数改造成生成器函数
使用元组:
def main():
    # 定义元组
    t = ('梁浩田', 22, True, '内蒙古呼和浩特')
    print(t)
    # 获取元组中的元素
    print(t[0])
    print(t[3])
    # 遍历元组中的值
    for member in t:
        print(member)
    t = ('lht', 22, True, '凉城')
    print(t)
    # 将元组转换成列表
    person = list(t)
    print(person)
    # 列表是可以修改它的元素的
    person[0] = 'll'
    person[1] = 23
    print(person)
    # 将列表转换成元组
    fruits_list = ['aaa', 'bbb', 'ccc']
    fruits_tuple = tuple(fruits_list)
    print(fruits_tuple)
使用集合:
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))