【专业课学习】《Python与数据科学》知识点杂记

151 阅读8分钟

93766174_p0.png

本文档主要用于记录《Python与数据科学》中的一些琐碎知识点和疑问点,以备期末考前复习查阅。

Part I Python3编程基础

print函数的sep参数和end参数有何作用?

在Python3中,print函数的sep参数用于在输出不同的对象时插入分隔符,默认为一个空格。可以通过指定不同的分隔符来改变输出的格式。

print("apple", "banana", "orange", sep=", ")
# => apple, banana, orange

而print函数的end参数用于指定输出行末的字符,默认为换行符"\n"。可以通过指定不同的字符来改变输出的行末。

print("Hello", end=" ")
print("World")
# => Hello World

使用time库和datetime库获取系统时间有什么差异?

对于time库:

import time                 
# time.time()获取当前时间的时间戳,即从1970年1月1日零点到现在经过的秒数,
# localtime()函数把时间戳转换为本地时间的时间元组格式。
i = time.localtime(time.time())  
# strftime()函数根据格式化字符串('%Y-%m-%d %H:%M:%S')来格式化时间元组,
# 输出类似"2023-03-14 11:22:33"这样的时间字符串。
print(time.strftime('%Y-%m-%d %H:%M:%S', i))  

对于datetime库:

import datetime
# 调用datetime模块的datetime类的now()方法,获取当前的日期和时间信息,
# 比time模块更为面向对象且用户友好。
j = datetime.datetime.now()  
# 直接打印datetime对象,输出的格式为"YYYY-MM-DD HH:MM:SS.ffffff",
# 其中"ffffff"表示微秒。
print(j)
# 使用datetime对象的属性(year, month, day)来获取年、月、日
print(j.year, j.month, j.day, sep='-')
# 同样使用datetime对象的属性(hour, minute, second)来获取时、分、秒
print(j.hour, j.minute, j.second, sep=':')

结论:总结来说,第二组代码在处理日期时间方面更加灵活和强大,也更加易于读写和维护。对于初学者来说,datetime模块通常更加推荐使用。

实现如下功能:令变量pi=3.1415926,将pi保留小数点后2位打印输出。

方法一:

pi = 3.1415926
# 使用 round() 函数保留小数点后 2 位
pi_rounded = round(pi, 2)
print(pi_rounded)

方法二:

print(f"{pi:.2f}")

方法三:

print("{:.2f}".format(pi))

字符串的切片和步长的操作

请解释以下python代码的输出结果:

>>> a='Hello' 
>>> a[:2]*3 
'HeHeHe' 
>>> a[::2]*3 
'HloHloHlo'

这两个代码实例分别涉及到字符串的切片和步长的操作。

第一个代码实例中,a[:2]表示取a的前两个字符,即'He',然后使用*3表示将'He'重复3次,因此结果为'HeHeHe'。

第二个代码实例中,a[::2]表示从开头到结尾,步长为2取字符串中的字符,即'Hlo',然后使用*3表示将'Hlo'重复3次,因此结果为'HloHloHlo'。

给出代码示例,说明字符串split方法有什么功能

sentence = "This is a sentence."
words = sentence.split()  # 使用默认空格作为分隔符
print(words)  # ['This', 'is', 'a', 'sentence.']

numbers = "1,2,3,4,5"
num_list = numbers.split(",")  # 使用逗号作为分隔符
print(num_list)  # ['1', '2', '3', '4', '5']

date = "2022-08-15"
year, month, day = date.split("-")  # 使用短横线作为分隔符
print(year, month, day)  # 2022 08 15

请你谈谈dict对象有哪些比较重要的方法?

  1. keys() 方法: keys() 方法返回一个字典的视图对象,它展示了字典中所有的键。这个视图对象是动态的,意味着当你修改字典时,视图会自动更新。
my_dict = {'a': 1, 'b': 2, 'c': 3}
keys = my_dict.keys()
print(keys)  # 输出: dict_keys(['a', 'b', 'c'])

# 当我们更改字典时,keys 视图也会随之变化
my_dict['d'] = 4
print(keys)  # 输出: dict_keys(['a', 'b', 'c', 'd'])
  1. pop() 方法: pop() 方法用于移除指定的键及其对应的值,并返回这个被删除的值。
my_dict = {'a': 1, 'b': 2, 'c': 3}
popped_value = my_dict.pop('b')
print(popped_value)  # 输出: 2
print(my_dict)       # 输出: {'a': 1, 'c': 3}

如果尝试弹出一个不存在的键,将会抛出异常。你可以通过提供第二个参数(默认值),以避免这种情况:

popped_value = my_dict.pop('z', 'Key not found')
print(popped_value)  # 输出: Key not found
  1. items() 方法: 它返回一个字典的键值对视图,通过它可以让我们同时迭代键和值。
for key, value in my_dict.items():
    print(key, value)
  1. values() 方法: 返回一个字典中所有值的视图对象,如果你只对值有兴趣,这个方法也是非常有用的。
vals = my_dict.values()
print(vals)  # 输出: dict_values([1, 3])
  1. get() 方法: 使用这个方法可以获取字典中的值,如果键不存在,则可以返回一个默认值,而不会抛出异常。
print(my_dict.get('a', 'Not found'))  # 输出: 1
print(my_dict.get('z', 'Not found'))  # 输出: Not found
  1. update() 方法: 使用update()可以用另一个字典的键值对来更新当前字典,覆盖已有的键的值或增加新的键值对。
my_dict.update({'c': 4, 'd': 5})
print(my_dict)  # 输出: {'a': 1, 'c': 4, 'd': 5}
  1. setdefault() 方法: 如果键不存在于字典中,可以通过这个方法插入键并将默认值赋给它。如果键存在,则不做任何操作并返回键的值。
my_dict.setdefault('e', 5)
print(my_dict)  # 输出: {'a': 1, 'c': 3, 'e': 5}
  1. copy() 方法: 这个方法可以用来创建字典的浅拷贝。
my_dict_copy = my_dict.copy()

举例说明列表推导式的用法?

例子:找出1到30之间能被2整除且不能被4整除的数,并将其存储在列表中。

使用传统for循环:

answers = [] 
for i in range(1, 31): 
    if i % 2 == 0 and i % 4 != 0: 
        answers.append(i);

使用列表推导式:

answers = [i for i in range(1, 31) if i % 2 == 0 and i % 4 != 0]

说实话,一开始在学习python的这个语法特性时,总感觉在哪里见过。后来才意识到,这不就是sql语言的风格嘛哈哈哈哈哈。

请编写代码分别统计字符串中英文字母、数字以及其他字符的个数。

诚然,我们可以使用传统的for循环和判断语句来实现:

str = "helllo12345aa*&@*"
cnt_letter = 0
cnt_number = 0
cnt_others = 0
for ch in str:
    if ('a' <= ch and ch <= 'z') or \
       ('A' <= ch and ch <= 'Z'):
       cnt_letter += 1
    elif ('0' <= ch and ch <= '9'):
        cnt_number += 1
    else:
        cnt_others += 1
print(f"英文字母共{cnt_letter}个,数字字符共{cnt_number}个,其他字符共{cnt_others}个")

接下来,给出一个综合运用Python内建函数和列表推导式实现上述功能的代码:

str = "helllo12345aa*&@*"
cnt_letter = sum(1 for ch in str if ch.isalpha())
cnt_number = sum(1 for ch in str if ch.isdigit())
cnt_others = len(str) - cnt_letter - cnt_number
cnt_number_and_letter = sum(1 for ch in str if ch.isalnum())
print(f"英文字母共{cnt_letter}个,数字字符共{cnt_number}个,其他字符共{cnt_others}个")
print(f"英文字母和数字字符共有{cnt_number_and_letter}个")

请编写一个用于判断完全平方数的代码

代码如下:

def isPerfectSquare(x):
    # 原理: 判断x能否表示成某个int整数的平方形式
    sqrt_x = int(x ** 0.5)
    return math.isclose(sqrt_x ** 2, x)

这段代码本身很简单,我们主要来关注一下其中蕴含的细节:

  • 我们可以通过int函数将一个浮点型转换为整型(机制为向零取整)。
  • 事实上,如果我们直接编写sqrt_x ** 2 == x,代码也可以运行,不会发生报错。
  • 这是因为Python内置了隐式的整型/浮点型转换机制,当进行需要浮点数参与的运算时,整数会自动转换为浮点数。
  • 但这并不是推荐的做法(不明白的同学可以回去复习一下计组中经典的0.1 + 0.2 != 0.3问题)。
  • 比较稳妥的办法是,在Python中进行关于浮点数的相等比较时,应使用math.isclose。这样,即使存在微小的误差,两个浮点数也可以被认为是相等的。

请谈谈map函数的用法

map() 函数的基本语法为map(function, iterable)

其中,function 参数是一个函数,用于指定对每个可迭代对象中的元素进行操作的函数;iterable 参数是一个可迭代对象,可以是列表、元组、集合等。

map() 函数会遍历可迭代对象中的每个元素,将其作为参数传递给指定的函数,然后将函数的返回值组合成一个新的可迭代对象(类型为<map object>)。

例如,将一个列表中的每个元素都加上1可以使用map() 函数实现:

def add_one(x):
    return x + 1

original_list = [1, 2, 3, 4, 5]
result_list = map(add_one, original_list)

print(list(result_list))  # 输出 [2, 3, 4, 5, 6]

需要注意的是,map() 函数返回的是一个迭代器对象,因此需要通过list() 函数将其展开为列表(或者可以直接在循环中使用)以便进行操作。

除了单个函数,也可以使用lambda 函数作为 map() 的第一个参数,实现临时的函数功能,例如:

original_list = [1, 2, 3, 4, 5]
result_list = map(lambda x: x * x, original_list)

print(list(result_list))  # 输出 [1, 4, 9, 16, 25]

总之,map() 函数是一个非常方便的工具,可以简化对可迭代对象的批量操作,提高代码的可读性和效率。