[TOC]
练习
- 练习
sum(),在不使用 sum() 的情况下计算list列表中的元素和。
- 初始化变量
sum_manual 为 0。
- 遍历
list, 每一次迭代将现有的值加在 sum_manual上。
- 遍历完成后,打印
sum_manual 和 sum(list) ,看看这两个值是否一致。
def get_sum_manual(input_list): sum_manual = 0 for item in input_list: sum_manual += item return sum_manual
list_1 = [1, 8, 10, 9, 7, 5] list_2 = [678, 685, 870, 927, 176] list_3 = [4444, 8897, 6340, 9896]
print("*********************************************************") print("sum = %d\tsum_manual = %d\n" % (sum(list_1), get_sum_manual(list_1))) print("*********************************************************") print("sum = %d\tsum_manual = %d\n" % (sum(list_2), get_sum_manual(list_2))) print("*********************************************************") print("sum = %d\tsum_manual = %d\n" % (sum(list_3), get_sum_manual(list_3)))
|
练习
使用刚刚创建好的 square() 函数,用它来计算10和16的平方。
- 将10的平方分配给变量squared_10
- 将16的平方分配给变量squared_16
def square(a_number): return a_number * a_number
squared_10 = square(10) squared_16 = square(16) print(squared_10) print(squared_16)
|
练习
让我们根据上述代码来修改为第一个函数extract(),用于提取我们想要的任何列的值。
from csv import reader
def extract(col): app_data_set = list(reader(open('assets/dataset/AppleStore.csv'))) content_ratings = [] for line in app_data_set[1:]: content_rating = line[col] content_ratings.append(content_rating) return content_ratings
content_ratings = extract(2) print(content_ratings)
|
练习
编写一个名为freq_table()的函数,该函数为任何列表生成频率表:
- 该函数应将列表作为输入。
- 在函数主体内,编写代码,为该列表生成频率表并将该表存储在字典中。
- 将频率表作为字典返回。
from csv import reader
def extract(col): app_data_set = list(reader(open('assets/dataset/AppleStore.csv'))) content_ratings = [] for line in app_data_set[1:]: content_rating = line[col] content_ratings.append(content_rating) return content_ratings
def freq_table(body): out = {} for key in body: out[key] = out.get(key, 0)+1 return out
content_ratings = freq_table(extract(10)) print(content_ratings)
|
练习
更新当前的 freq_table() 函数以增加可复用性。
- 这次函数应该接受两个输入:一个数据集和一个列的索引。
- 在函数内:
- 使用数据集(包含列表的列表)参数循环访问数据集,对于每次迭代,使用参数即索引号来选择所需的值。
- 将频率表构建为字典。
- 该函数应将频率表作为字典返回。
from csv import reader
def freq_table(body, index): out = {} for line in body: out[line[index]] = out.get(line[index], 0)+1 return out
answer = freq_table( list(reader(open('assets/dataset/AppleStore.csv')))[1:], 10) print(answer)
|
练习
使用 freq_table() 函数为cont_rating,user_rating和prime_genre列生成频率表。
- 为cont_rating列生成表时,请使用位置实参,将表分配给一个名为content_ratings_ft的变量。
- 按照顺序(数据集,索引)对 user_rating 列使用关键字参数,将表分配给一个名为ratings_ft的变量。
- 按照顺序(索引,数据集)对prime_genre列使用关键字参数,将表分配给名为genres_ft的变量。
from csv import reader
def freq_table(body, index): out = {} for line in body: out[line[index]] = out.get(line[index], 0)+1 return out
content_ratings_ft = freq_table( list(reader(open('assets/dataset/AppleStore.csv')))[1:], 10) ratings_ft = freq_table( body=list(reader(open('assets/dataset/AppleStore.csv')))[1:], index=7) genres_ft = freq_table(index=11, body=list( reader(open('assets/dataset/AppleStore.csv')))[1:]) print(content_ratings_ft) print(ratings_ft) print(genres_ft)
|
练习
- 编写一个名为
mean() 的函数,该函数计算我们想要从数据集中获取的任何列的均值。
- 该函数应接受两个输入:数据集和索引值。
- 在
mean() 函数的内部,使用 extract() 函数将列的值提取到单独的列表中,然后使用 find_sum() 和 find_length() 计算该列表中的值的平均值。
mean() 函数应返回列的均值。
- 使用
mean() 函数计算 price 列的平均值,将结果分配给名为 avg_price 的变量。
from csv import reader
def extract(body, index): out = [] for line in body: content_rating = line[index] out.append(content_rating) return out
def find_sum(a_list): a_sum = 0 for element in a_list: a_sum += float(element) return a_sum
def find_length(a_list): length = 0 for element in a_list: length += 1 return length
def mean(body, index): list_x = extract(body, index) return find_sum(list_x)/find_length(list_x)
avf_price = mean(list(reader(open('assets/dataset/AppleStore.csv')))[1:], 4) print(avf_price)
|
语法
- 使用单个参数创建函数:
def square(number): return number**2
|
- 创建具有多个参数的函数:
def add(x, y): return x + y
|
- 在另一个函数的定义内重复使用一个函数:
def add_to_square(x): return square(x) + 1000
|
概念
- 通常,函数会包含:
- 它接受输入。
- 它对该输入进行处理。
- 它返回一个输出。
- 从结构上讲,函数由
def 语句,主体和 return 语句组成。
- 输入变量称为形参,参数采用的各种值称为实参。在square(number=6)中,number变量是形参。6是传递给形参number的实参。
- 通过名称传递的参数称为关键字参数,当我们使用多个关键字参数时,形参顺序不重要。
- 通过位置传递的参数称为位置参数。当我们使用多个位置参数时,必须按照函数定义的形参顺序输入实参。
- 调试更复杂的功能可能会更具挑战性,但是我们可以通过阅读报错中的traceback来发现错误。