day 09 python学习

本文详细介绍了Python中的列表、集合及元组推导式的基本结构和应用,包括条件和多重循环结构。此外还讲解了函数的概念、定义和调用方法,涵盖了参数传递的各种方式。

day 09 python学习

1、列表推导式

1)基本结构
[表达式 for 变量 in 序列]
[ ]
产生一个新的列表,列表中的元素就是每次循环对应的表达式的结果
list1 = [10 for x in range(3)]
print(list1)    # [10, 10, 10]

list2 = [2*x for x in range(1, 4)]
print(list2)  # [2, 4, 6]
2)条件结构
[表达式 for 变量 序列 if 条件语句]
list4 = [x for x in range(10) if x % 2] 
print(list4)  # [1, 3, 5, 7, 9]
list5 = [f'str{x}' for x in range(1, 100) if x == 1 or x % 3 == 0]
print(list5)   # 'str1', 'str3', 'str6', 'str9', 'str12', 'str15', 'str18', 'str21', 'str24', 'str27', 'str30', 'str33', 'str36', 'str39', 'str42', 'str45', 'str48', 'str51', 'str54', 'str57', 'str60', 'str63', 'str66', 'str69', 'str72', 'str75', 'str78', 'str81', 'str84', 'str87', 'str90', 'str93', 'str96', 'str99']
list6 = ['str1' if x == 0 else f'str{x}'for x in range(0, 100, 3)]
print(list6)  # 
3)多重循环结构
列表 = [表达式 for 变量 in 序列1 for 变量2 in 序列2]
相当于:
列表[]
for 变量1 in 序列1:
for 变量2 in 序列2:
列表.append(表达式)
list8 = [f'{x}{y}' for x in range(3) for y in 'abc']
print(list8)  # ['0a', '0b', '0c', '1a', '1b', '1c', '2a', '2b', '2c']
2、集合推导式
a1 = {x for x in 'hello'}
print(a1)  # {'h', 'e', 'l', 'o'} 集合元素唯一去重
3、元组和集合推导式
元组 - 将列表推导式[]变tuple()
字典 - (表达式时键值对形式)将列表推导式的[]变{}
a2 = tuple(x*2 for x in 'hello')
print(a2)   # ('hh', 'ee', 'll', 'll', 'oo')  元组
  
a3 = {x: x*2 for x in 'hello'}
print(a3)   #{'h': 'hh', 'e': 'ee', 'l': 'll', 'o': 'oo'} 字典
练习 通过字典推导式 交换一个字典的键和值
dic = {'a': 10, 'b': 20, 'c': 30}

a5 = {dic[x]: x for x in dic}

2、函数

1.没有函数会遇到什么问题:

a. 相同功能对应的代码需要重复写
b. 一旦功能发生改变,需要将使用到这个功能的代码的位置全部修改

怎么解决:使用函数
2、函数基础
1)认识函数

a. 什么是函数?

​ 函数就是对实现某一特定功能的代码的封装。(机器)

b.函数的分类

系统函数:python已经定义好,程序员可以直接使用的函数。例如:list、print、input、max等。

自定义函数:由程序员自己定义,程序员可以自己使用也可以给别人使用

2)自定义函数
语法:
def 函数名(形参列表):
    函数说明文档
    函数体
    
说明:
1) def      -   关键字;固定写法
2) 函数名    -   程序员自己命名;
                要求:标识符、不能是关键字
                规范:字母小写,单词之间用_隔开;
                     见名知义(看到函数名大概知道函数的功能);
                     不使用系统的函数名、类型名和模块名
3) ():      -   固定写法(不能省略)
4) 形参列表  -   以 '变量名1,变量名2,变量名3,...' 的形式存;
                形参的作用是将函数外部的数据传递到函数里面(如果实现函数的功能需要提供外部数据,那么这个函数就需要形参)
5) 函数说明文档   -   函数的说明书;本质就是用""""""引起来的注释
6) 函数体      -   和def保持一个缩进的一条或者多条语句(至少一条);
                  实现函数功能的代码段
                  
(重点)注意:定义函数的时候不会执行函数体

示例1:定义一个函数求任意两个数字的和

def sum1(num1, num2):
    """
    求两个数字的和  -  (函数功能说明区)
    :param num1: 提供第一个数字    -   (参数说明)
    :param num2: 提供第二个数字    -   (参数说明)
    :return: None   -   (返回值说明)
    """
    print(num1+num2)

练习1:定义一个函数,求一个数的阶乘:

def factorial(num):
    """
    求一个数的阶乘
    :param num: 指定的数字
    :return: None
    """
    s = 1
    for x in range(1, num+1):
        s *= x
    print(f'{num}的阶乘是:{s}')

练习2:写一个函数将两个字符串交叉合并

def merge(str1, str2):
    len1 = len(str1)
    len2 = len(str2)
    # 先交叉拼接相同长度的部分
    new_str = ''
    for index in range(min(len1, len2)):
        new_str += str1[index] + str2[index]

    # 再确定尾部
    if len1 > len2:
        new_str += str1[len2:]
    else:
        new_str += str2[len1:]
    print(new_str)
3、调用函数
语法:
函数名(实参列表)

说明:
函数名     -       需要使用的已经定义好的函数的函数名
()        -       固定写法
实参列表    -      以 '数据1,数据2,数据3,...' 的形式存在;
                  实参就是需要从函数外部传递到函数内容使用的具体的数据
                  (默认情况下被调用的函数有多少形参就需要提供多少个实参)
# 1.位置参数和关键字参数
# 根据实参的传递方式将实参分为位置参数和关键字参数两种
"""
1)位置参数
以 '实参1,实参2,实参3,...' 形式存在,让实参和形参一一对应

2)关键字参数
以 '形参1=实参1,形参2=实参2,...'形式存在,这个参数的位置可以随意更改

3)位置参数和关键字参数混用

**位置参数必须在关键字参数的前面                  
# 位置参数
func1(10, 20, 30)   # a:10, b:20, c:30
func1(30, 20, 10)   # a:30, b:20, c:10

# 关键字参数
func1(a=100, b=200, c=300)  # a:100, b:200, c:300
func1(b=200, c=300, a=100)  # a:100, b:200, c:300

# 混用
func1(10, 20, c=30)    # a:10, b:20, c:30
func1(100, c=230, b=220)    # a:100, b:220, c:230

# func1(500, 600, a=400)
# func1(a=400, 500, 600)   # 报错
2.参数默认值

定义函数的时候可以直接给一个或者多个形参赋默认值;有默认值的参数在调用的时候可以不传参。

def func2(a=1, b=2, c=3):
    print(f'a:{a}, b:{b}, c:{c}')


func2()   # a:1, b:2, c:3
func2(10, 20)   # a:10, b:20, c:3
func2(b=200)    # a:1, b:200, c:3
def func3(a, b, c=3):
    print(f'a:{a}, b:{b}, c:{c}')


func3(100, 200)   # a:100, b:200, c:3
func3(100, 200, 300)   # a:100, b:200, c:300

# 有默认值的参数必须在没有默认值参数的后面
def func4(a, c, b=200):
    print(f'a:{a}, b:{b}, c:{c}')


func4(1, 3)    # a:1, b:200, c:3

3、不定长参数

定义函数的时候如果参数个数不确定,可以使用不定长参数

1)带*的不定长参数
在形参前加*让这个形参变成不定长参数,可以同时接受多个实参。
这个参数的本质就是一个元组,传递的对应的实参全部会变成这个元组中的元素。
(必须使用位置参数传参)

2)带**的不定长参数
在形参前加**让这个形参变成不定长参数,可以同时接受多个实参。
这个参数的本质就是一个字典(必须使用关键字参数传参,关键字自己随意命名)

# 定义一个函数,求多个数的平均值
def mean(*num):
    if len(num) == 0:
        print('0')
    else:
        print(sum(num)/len(num))


mean()
mean(10)
mean(20, 12)
mean(20, 12, 23, 23, 432, 121, 90)

def func5(*a):
    print('a:', a)


func5(23, 45)
print(func5)
func5(1, 2, 3, 4)
print(func5)

# 这儿的x必须使用位置参数传参
def func6(x, *a):
    print('a:', a, 'x:', x)


func6(20)   # a: () x: 20
func6(10, 20, 30, 40)   # a: (20, 30, 40) x: 10

# 这儿的x必须使用关键字参数传参
def func7(*a, x=90):
    print('a:', a, 'x:', x)


func7(23, 34, 45)    # a: (23, 34, 45) x: 90
func7(1, 2, 3, 4, x=100)    # a: (1, 2, 3, 4) x: 100

# 字典
def func8(**num):
    print(num)


func8()
func8(a=100)    # {'a': 100}
func8(name='张三', age=30)    # {'name': '张三', 'age': 30}

# 面试题:func(*args, **kwargs) , 函数func中*args, **kwargs有什么意义
# 让函数调用的时候更加灵活 关键词传参和位置传参都可以使用

def func(*args, **kwargs):
    pass


func()
func(2, 3, 4)
func(a=23, b=23, c=34, d=11)
func(23, 31, a=1, b=290)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值