python 练习笔记(一)

python 练习笔记(一)

Question 1

编写一个程序,找到所有这些能被7整除但不是5的倍数的数字,在2000和3200之间(都包括在内)。得到的数字应以逗号分隔的顺序打印在一行中。

l=[]
for i in range(2000,3201):
     if (i%7==0) and (i%5!=0):
          l.append(str(i))
# Best way
l=[str(x) for x in range(2000,3201) if (x%7==0) and (x%5!=0]
print(','.join(l))

重点理解:

  1. 列表推导式(list comprehension)是指循环创建列表.
    [x for x in 内容]
    [x for x in 内容 if 条件]
    (1):要把生成的元素x放到前面,执行的时候,先执行后面的for循环
    (2):后面跟上for循环 可以有多个for循环,也可以在for循环后面加个if条件
    (3):for循环后面可以是任何方式的迭代器(元组,列表,生成器。)只要可以迭代的对象中有一个值。
  2. python中join()和split()函数
    join能让我们将指定字符添加至字符串中
    split()能让我们用指定字符分割字符串

Question 2

写一个程序,可以计算一个给定数字的阶乘。计算结果应以逗号分隔的方式打印在一行中。假设提供给程序的输入如下。
8
那么,输出应该是。
40320
提示:在输入数据被提供给问题的情况下,应假定它是一个控制台输入。

Solution 1

def fact(x):
      if x==0:
          return 1
       return x*fact(x-1)
 x=int(input())
 print(fact(x))

Solution 2

from funtools import reduce
from operator import mul
x=int(input())
print(reduce(mul,range(1,x+1))
"""
import math as ma
x=int(input())
print(ma.factorial(x))
"""

重点理解:

  1. reduce()函数
    reduce(function, sequence [, initial] ) -> value
    reduce的工作过程是 :在迭代sequence(tuple ,list ,dictionary, string等可迭代物)的过程中,首先把 前两个元素传给函数参数,函数加工后,然后把得到的结果和第三个元素作为两个参数传给函数参数, 函数加工后得到的结果又和第四个元素作为两个参数传给函数参数,依次类推

    reduce(lambda x, y: x * 10 + y, [1 , 2, 3, 4, 5])
    >>>12345

  2. math.factorial()方法是数学模块的库方法,用于查找给定数字的阶乘,它接受正整数并返回数字的阶乘。

Question 3

在给定的整数n下,写一个程序来生成一个字典,其中包含(i, i*i),使得是1和n之间的整数(都包括在内).然后程序应该打印这个字典。假设提供给程序的输入如下。8 然后,输出应该是。{1: 1, 2: 4, 3: 9, 4: 16, 5: 25, 6: 36, 7: 49, 8: 64}

Solution 1

n=int(input())
d=dict()
for i in range(1,n+1):
      d[i]=i*i
 print(d)

Solution 2

n=int (input())
d{x:x*x for x in range(1,n+1)}
print (d)

Question 4

编写一个程序,从控制台接受一串逗号分隔的数字,并生成一个列表和一个包含每个数字的元组。假设向该程序提供了以下输入。34,67,55,33,12,98 然后,输出应该是。
[‘34’, ‘67’, ‘55’, ‘33’, ‘12’, ‘98’]
(‘34’, ‘67’, ‘55’, ‘33’, ‘12’, ‘98’)

values=input()
l=values.split(",")
t=tuple(l)
print(f"List of values : {l}")
print(f"Tuple of values : {t}")

重点理解:
'f-strings’是Python的一种新的字符串格式化方法,要使用f-strings,只需在字符串前加上f,以大括号 {} 标明被替换的字段。其基本用法:

	name = "Tom"
	age = 3
	f"His name is {name}, he's {age} years old."
	>>>"His name is Tom, he's 3 years old."
	> 实质上,把括号内的当作是变量即可。

Question 5

定义一个至少有两个方法的类:getString:从控制台输入获得一个字符串 printString:打印大写的字符串。也请包括简单的测试函数来测试类的方法。

class InputOutString:
    def __init__(self):
        self.s = ""
    def getString(self):
        self.s = input()
    def printString(self):
        print(self.s.upper())
a=InputOutString()
a.getString()
a.printString()

重点理解:

  1. init 方法的第一个参数永远是 self ,表示创建的实例本身,因此,在 init 方法的内部,就可以把各种属性绑定到 self,因为 self 就指向创建的 实例本身
  2. 使用了 init 方法,在创建实例的时候就不能传入 空的参数了,必须传入与 init 方法匹配的参数,但是 self 不需要传,python解释器会自己把实例变量传进去

Question 6

写一个程序,根据给定的公式计算并打印出数值。Q=[(2CD)/H]的平方根 以下是C和H的固定值:C是50。H是30。D是变量,其值应以逗号分隔的顺序输入到你的程序中。例子 让我们假设给程序提供以下逗号分隔的输入序列。100,150,180 该程序的输出应该是。18,22,24
提示。如果收到的输出是小数,应该四舍五入到最接近的数值(例如,如果收到的输出是26.0,应该打印成26

import math
c=50
h=30
value=[]
items=[x for in input ("Input numbers comma-separated:").split(',')]
for d in items:
      value.append(str(int(round(math.sqrt(2*c*float(d)/h)))))
 print(','.join(value))

Question 7

编写一个程序,将2个数字X,Y作为输入,生成一个二维数组。在数组的第i行和第j列的元素值应该是i*j。注:i=0,1…, X-1; j=0,1,¡Y-1. 例子 假设给程序的输入是以下的。3,5 那么,该程序的输出应该是。[[0, 0, 0, 0, 0], [0, 1, 2, 3, 4], [0, 2, 4, 6, 8]]
注意:在向问题提供输入数据的情况下,应假定它是以逗号分隔的形式的控制台输入。

input_str=input()
dimensions=[int(x) for x in input_str.split(',')]
rowNum=dimensions[0]
colNum=dimensions[1]
multilist = [[0 for col in range(colNum)] for row in range(rowNum)]
for row in range(rowNum):
      for col in range(colNum):
             multilist[row][col]=row*col
print(multilist)

重点理解:
初始化一个5x6每项为0(固定值)的数组(推荐使用):
multilist = [[0 for col in range(5)] for row in range(6)]

Question 8

编写一个程序,接受一个以逗号分隔的单词序列作为输入,并在按字母排序后打印出以逗号分隔的单词。假设向该程序提供以下输入:without,hello,bag,world
那么,输出应该是:
bag,hello,without,world

original_string = input("Input Text:")
l = original_string.split(",")
final_string = sorted(l,key=str)
print(','.join(final_string))

Question 9

编写一个程序,接受一串以空格分隔的单词作为输入,在去除所有重复的单词并按字母数字排序后,打印出这些单词。
假设向该程序提供以下输入:
hello world and practice makes perfect and hello world again
那么,输出应该是:
again and hello makes perfect practice world

solution 1

s=input("Input Text:")
words=[word for word in s.split(" ")]
print(" ".join(sorted(list(set(words)))))

Solution 2

word = input().split()
for i in word:
    if word.count(i) > 1:
        word.remove(i)
word.sort()
print(' '.join(word))

Qusetion 10

编写一个程序,接受一连串的句子作为输入,并将句子中的所有字符大写后打印出来。假设向该程序提供了以下输入:
Hello world
Practice makes perfect
那么,输出应该是:
HELLO WORLD
PRACTICE MAKES PERFECT

Solution 1

lines = []
while True:
    s = input()
    if s:
        lines.append(s.upper())
    else:
        break;
for sentence in lines:
    print(sentence)

Solution 2

def inputs():
    while True:
        string = input()
        if not string:
            return
        yield string
print(*(line.upper() for line in inputs()),sep='\n')

其中 yield用法
yield 的例子来源于文件读取。如果直接对文件对象调用 read() 方法,会导致不可预测的内存占用。好的方法是利用固定长度的缓冲区来不断读取文件内容。通过 yield,我们不再需要编写读文件的迭代类,就可以轻松实现文件读取

你可能感兴趣的:(python,函数式编程)