简记 2022/9/2

python基础学习

列表推导式

推导式是从可迭代对象中快速简洁地创建数据类型的一种方法。它使得你用优美简短的代码就能实现循环甚至条件判断。

利用推导式可以得到列表、字典、集合以及生成器。列表推导式会产生一个新的列表,其语法形式如下所示:

[expr for item in iterable_obj]

题目:利用列表推导式,产生一个由10个随机英文字母构成的字符串。

import random
import string
# random.choice() 从参数中随机选取一个字符
# string.ascii_letters  根据当前语言环境返回包含小写和大写字母的字符串
# random.choice(string.ascii_letters)   随机输出一个字母
# 普通的for循环方法
en_str=""
for i in range(1,11):
    en_str+=random.choice(string.ascii_letters)

# 列表推导式
en_str2=[random.choice(string.ascii_letters) for i in range(1,11)]
# 将列表转换为字符串
end=''.join(en_str2)
print(en_str)
print(en_str2)
print(end)

结果:

gcAprhCUni
[‘v’, ‘f’, ‘H’, ‘D’, ‘G’, ‘J’, ‘r’, ‘H’, ‘E’, ‘t’]
vfHDGJrHEt

借鉴文章:https://blog.csdn.net/kikocsdn/article/details/97757236

zip函数

Python 中提供了一个非常有用的函数:zip 函数。 这个函数可以将这些序列并排的元素配对成元组后,组成一个新的可迭代对象。其语法格式如下:

zip(*iterables)

stock_code = ('600000', '600036', '600048', '000001') 
stock_name = ('浦发银行', '招商银行', '保利地产', '平安银行') 
close_price = [11.54, 36.84, 16.61, 14.49] 
for item in zip(stock_code, stock_name, close_price):
    print('{1} 的代码是:{0},收盘价:{2:.2f} 元'.format(item[0], item[1], item[2]))

结果:
在这里插入图片描述

map函数

在 Python 中,可以利用 map 函数简化这类代码。其语法格式如下:

map(func, *iterables)

map 函数有两个参数,func 是一个函数, 也就是对序列中元素进行的操作。第一个参数 function 以参数序列中的每一个元素调用 function 函数,返回包含每次 function 函数返回值的新列表。
案例:

amt_str = input(' 请输入销售数量 ( 用逗号隔开 ):') 
amt_str_list = amt_str.split(',') 
amt_int_map_obj = map(int, amt_str_list) 
print(' 总销售数量为:{} 件 '.format(sum(amt_int_map_obj)))

字典

避免键不存在错误的方法 get() 和 setdefault()

在字典中访问不存在的键, 会触发 KeyError 的异常错误。字典的 get() 方法可以让我们放心地通过键取值,而不用 if 语句进行判断。

get(key, default=None)

如果没有遭到想查找的键,就会返回第二个参数

还有一个类似的方法 setdefault(),该方法也可以根据键取值。不同的是,如果键不存在,这个键值对会被添加到字典中。

setdefault(key, default=None)

案例:计算一个字符串中每个字符出现的次数。

massage="csjdncinksjcb"
# 用字典来保存计数
count={}
for character in massage:
#     创建一个键值对   字符作为键,次数作为值  默认值是0
    count.setdefault(character,0)
#     把次数加一,就是把值加一
    count[character] = count[character] + 1
print(count)

字典推导式:
与列表类似,字典也可以使用推导式来生成。字典推导式利用每次迭代收集表达式的键和值结果,并将该键值对添加到新的字典中。语法形式如下:

{key_expression : value_expression for expression in iterable}

stock_code = ['600000', '600036', '600048', '000001']

close_price = [11.54, 36.84, 16.61, 14.49]

stock_dic = {code: price for code, price in zip(stock_code, close_price)}

stock_dic

# {'600000': 11.54, '600036': 36.84, '600048': 16.61, '000001': 14.49}

加上if条件过滤

{key_expression : value_expression for expression in iterable if condition}

案例:人事统计
现有人事信息表格数据如下:
在这里插入图片描述对下列表格进行统计:
各部门人数
使用不同电子邮箱人数

第一步:将所有数据存入一个列表中:

employeeList = [['10932','张珊','管理','zhans@163.com'],
                 ['10933','李思','软件','lisi@163.com'],
                 ['10934','王武','财务','wangwu@example.com'],
                 ['10935','赵柳','财务','zhaoliu@163.com'],
                 ['10936','钱棋','人事','qianqi@example.com'],
                 ['10941','张明','管理','zhangming@example.com'],
                 ['10942','赵敏','人事','zhaomin@163.com'],
                 ['10945','王红','培训','wanghong@example.com'],
                 ['10946','李萧','培训','lixiao@example.com'],
                 ['10947','孙科','软件','sunke@163.com'],
                 ['10948','刘利','软件','liuli@example.com']]

统计各部门的人数:

# 先定义一个空的字典用来存放部门对应的人数
dempartmentCounter = {}
for detailList in employeeList:
    dempartmentCounter.setdefault(detailList[2], 0)
    dempartmentCounter[detailList[2]] = dempartmentCounter[detailList[2]] + 1
print(dempartmentCounter)

统计使用不同电子邮箱的人数

# 建立一个空字典用于存储电子邮箱及人数
emailCounter = {}
for detailList in employeeList:
#     获取电子邮箱发字符串
    email = detailList[3].split('@')[1]
#     将电子邮箱和人数用字典存储   get()键存在返回相应值,否则返回默认值
    curUserCount = emailCounter.get(email,0)
    emailCounter[email] = curUserCount + 1
print(emailCounter)

集合

集合中的元素是不可重复的, 常常用于检查某个元素是否存在。
在 Python 中使用“ {}”创建的是空字典, 而不是空集合。 创建空集合应该使用 set() 函数。
集合还有四个常用的操作:交集(&)、并集(|)、差集 (–)、对称差集(^)

集合推导式

与字典推导式类似, 集合推导式使用的也是花括号“ {}”。 不同的是, 集合推导式在 for 关键字前的表达式结果是一个元素,而不是键值对。语法形式如下:

{expression for item in iterable if condition}

股票涨跌统计:
在这里插入图片描述请根据以上数据,进行以下统计:

至少有 1 天上涨的股票。
第 1 天跌了,第 2 天涨了的股票。
第 1 天跌了,第 2 天没有跌的股票。
仅在第 1 天或第 2 天涨了的股票
stock_day1 = [('招商银行', 0.0124), ('兴业银行', 0.0111), ('宁波银行', 0.0036), 
              ('上海银行', 0.0033), ('浦发银行', 0.0000), (' 工商银行', -0.0071), 
              ('中国银行', -0.0078), ('农业银行', -0.0080), ('建设银行', -0.0086)]
stock_day2 = [('兴业银行', 0.0231), ('浦发银行', 0.0102), ('建设银行', 0.0020), 
              ('农业银行', 0.0020), ('工商银行', 0.0000), ('中国银行', -0.0065), 
              ('宁波银行', -0.0102), ('招商银行', -0.0203), ('上海银行', -0.0213)]

day1_rise = {name for name, pct in stock_day1 if pct> 0}
day1_fall = {name for name, pct in stock_day1 if pct< 0}
day2_rise = {name for name, pct in stock_day2 if pct> 0}
day2_fall = {name for name, pct in stock_day2 if pct< 0}

print('至少有 1 天上涨的股票:')
for name in day1_rise | day2_rise:
    print(name, end=' ')

print('\n\n第 1 天跌了,第 2 天涨了的股票:')
for name in day1_fall & day2_rise:
    print(name, end=' ')
    
print('\n\n第 1 天跌了,第 2 天没有跌的股票:')
for name in day1_fall - day2_fall:
    print(name, end=' ')

print('\n\n仅在第一天或第 2 天涨了的股票:')
for name in day1_rise ^ day2_rise:
    print(name, end=' ')

6.2 个人所得税计算

函数

使用单星号*来收集位置参数,双星号**收集关键字参数。

解包

def empDetailInfo(name, department='', phone='', email=''):
    if name and len(name) > 0:
        print(name + '的信息如下:')
        print('部门:' + department)
        print('电话号码:' + phone)
        print('电子邮箱:' + email)
    else:
        print('必须有姓名信息。')

当调用者的数据存储在列表中时, 可以通过在列表前加上*对列表解包来实现位置参数形式的调用。

emp_info1 = ['张明', '管理', '18612345683', 'zhangming@qq.com']
empDetailInfo(*emp_info1)

当调用者的数据存储在字典中时, 可以通过在字典前加上**对字典解包来实现关键字参数形式的调用。

emp_info2 = {'name':'张珊', 'department':'管理', 'email':'zhangs@163.com'}
empDetailInfo(**emp_info2)

global

关键字 global 语句通常放在函数体的开始部分,用于申明变量为全局变量。其语法如下:

global variable_names

匿名函数 lambda

递归函数

案例:斐波那契数列
在数学上,斐波纳契数列以如下被以递推的方法定义:?(1)=1,?(2)=1,?(?)=?(?−1)+?(?−2)(?>=3,?∈?)

这个数列从第3项开始,每一项都等于前两项之和。

编写程序,用户输入正整数 n,输出斐波那契数列的前 n 项。

def fibo(n):
    if n == 1:
        return 1
    elif n == 2:
        return 1
    else:
        return fibo(n-1)+fibo(n-2)
num = int(input('请输入一个大于 3 的正整数 :'))
print('\n斐波那契数列的前 {} 项为:'.format(num))
# 因为range函数包前不包后,所以是num+1
for i in range(1, num+1):
    print(fibo(i), end=' ')   

结果:

请输入一个大于 3 的正整数 : 7
斐波那契数列的前 7 项为:
1 1 2 3 5 8 13 

用字典改进:

calculate_dic = {1: 1, 2: 1}

def fibByDic(n):
    if n not in calculate_dic:
        new_value = fibByDic(n-1) + fibByDic(n-2)
        calculate_dic[n] = new_value
    return calculate_dic[n]
num = int(input('请输入一个大于3的正整数:'))
print('\n斐波那契数列的前{}项为:'.format(num))
for i in range(1, num + 1):
    print(fibByDic(i), end=' ')

函数fibByDic()运行速度要比fibo()快 为什么?????

案例2:字符串反转: 对于用户输入的字符串s,利用递归的方式,输出反转后的字符串。

def reverse(s):
#     递归出口
    if len(s) == 0:
        return ""
    return reverse(s[1:]) + s[0]
reverse("564")

版权声明:本文为qq_43600161原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。