有序:可以通过下标索引访问元素 无序:不可以通过下标索引访问元素 可变:可以被修改 不可变:不可以被修改
| 有序 | 无序 | |
| 可变 | 列表list | 字典dict、集合set |
| 不可变 | 字符串str、元组tuple | 数值int、float、bool、complex(x + yj) |
str1 = 'Hello World!'str2 = 'Hello Nowcoder!'print(str1,str2,sep='\n')输出:Hello World!Hello Nowcoder!
print(r'\nmenkim is me') #\nmenkim is mename = r'\nmenkim is me'print(name) #\nmenkim is meprint('\nmenkim is me') #会先换行然后输出menkim is me
print('0.343'.isnumeric()) #Falseprint('1'.isnumeric()) #True
如果字符串中的所有字符都是数字,并且至少有一个字符,返回 True ,否则返回 False 。数字包括十进制字符和需要特殊处理的数字,如兼容性上标数字。这包括了不能用来组成 10 进制数的数字,如 Kharosthi 数。
#实现输入整数,输出内容和并转化为int类型num = input()if num.isdigit():a = int(num)print(a,type(a),sep="\n")else:print("非数字")
name = input()print("I am %s and I am studying Python in Nowcoder!" %name)# print(f"I am {name} and I am studying Python in Nowcoder!")# print("I am {} and I am studying Python in Nowcoder!".format(name))
0。如果有base输入,则x必须为字符串,可以将2-36进制转换为10进制
int() #输出0int(23.6) #浮点数向下取整,23,默认10进制int(23) #输入整数时,默认10进制int('0xa',16)#如果有base输入,且x以字符串形式输入,#代表x为base进制,则按照输入的base将x转换为10进制输出输出:10int('10',8) #将8进制转化为10进制输出:8
#将十六进制整数ABCDEF,转换为十进制整数dic = {'A':10,'B':11,'C':12,'D':13,'E':14,'F':15}n = 0m = 'ABCDEF'l = len(m)for i in m:n = n + dic[i]*16**(l-1)l = l - 1print("%15d" % n)
如十进制120 —> 六进制
120/6=20 ----余0
20/6=3 ----余2
3/6=0 ----余3 (注:循环下去,直到商为0)
很明显所对应的六进制数为320
n = int(input()) #输入120m = ''while n != 0:m += str(n%6) #将余数拼接n = n//6print(m[::-1]) #将得到的数转制
'utf-8'。
True,否则返回
False。字母字符是指那些在 Unicode 字符数据库中定义为 "Letter" 的字符,即那些具有 "Lm"、"Lt"、"Lu"、"Ll" 或 "Lo" 之一的通用类别属性的字符。
True, 否则返回
False。
str1 = input()if str1.encode('utf8').isalpha(): #判断字符串是否均为字母print(len(str1))else:print("请重新输入")
str1 = "hello world"str1.title()输出:'Hello World'
"they're bill's friends from the UK".title()输出:"They'Re Bill'S Friends From The Uk"
import redef titlecase(s):return re.sub(r"[A-Za-z]+('[A-Za-z]+)?",lambda mo: mo.group(0).capitalize(),s)titlecase("they're bill's friends.")输出:"They're Bill's Friends."
" hEllo world".capitalize() #输出 ' hello world'"hEllo world".capitalize() #输出 'Hello world'"hello world".capitalize() #输出 'Hello world'
None,则 chars 参数默认移除空白符。实际上 chars 参数并非指定单个前缀或后缀;而是会移除参数值的所有组合:
'www.example.com'.strip('cmowz.')输出:'example'
str:要截取的字符串;
start:表示要截取的第一个字符所在的索引(截取时包含该字符)。如果不指定,默认为 0,也就是从字符串的开头截取;
end:表示要截取的最后一个字符所在的索引(截取时不包含该字符)。如果不指定,默认为字符串的长度;
step:指的是从 start 索引处的字符开始,每 step 个距离获取一个字符,直至 end 索引出的字符。step 默认值为 1,当省略该值时,最后一个冒号也可以省略。
特殊用法:当step为负数,start和end没有指定时,默认从序列右边向左按步幅切片
a = "Hello"print(a[:4])输出:'Hell'
c = '123'print(c[2::-1]) #等同于c[::-1]print(c[::-1])输出:321321
sorted([5, 2, 3, 1, 4])输出:[1, 2, 3, 4, 5]
a = [5, 2, 3, 1, 4]a.sort()a #输出:[1, 2, 3, 4, 5]
a = [5, 2, 3, 1, 4]a.reverse()a #输出:[4, 1, 3, 2, 5]
reversed(seq)
返回一个反向的 iterator。seq 必须是一个具有 __reversed__() 方法的对象或者是支持该序列协议(具有从 0 开始的整数类型参数的 __len__() 方法和 __getitem__() 方法)
a=''.join(list(reversed('1234')))print(a)输出:4321
'1234'[::-1] #输出'4321'
expression为字符串表达式,可以将字符串转化为其他的类型,list,dict,set,int,tuple等
globals为全局变量作用域,必须为字典,当表达式中的变量在globals中存在时,会忽略外部变量,使用该变量的值
locals为本地变量作用域,可以为任意映射对象,当表达式中的变量在locals中存在时,会忽略外部和globals中相同变量,使用该变量的值
a = "{1,2,3,4}"b = eval(a)print(b,type(b))输出:{1, 2, 3, 4} <class 'set'> #其他同理
a = 12print(eval('a+1'))输出:13
a = 12g = {'a':4}print(eval('a+1',g))输出:5
a = 12b = 11c = 10g = {'a':4,'b':3}l = {'b':2,'c':1}print(eval('a+b+c',g,l))输出:7
map(function,iterable,...) 高阶函数
接受函数和可迭代对象,将函数作用于每个可迭代对象中的元素,得到一个迭代器,可用不同的数据类型接收值:
x,y = map(int,('2','3'))print(x,y,type(x),type(y))输出:2 3 <class 'int'> <class 'int'>
r = map(lambda x:x*2,(2,3))list(r)输出:[4, 6]
隐式判断:
False:0、[ ]、{}、()、""、None
True:除False以外的任意对象
逻辑运算符:与and、或or、非not
A and B :如果A为False,返回A,否则返回B的值
A or B :如果A为True,返回A,否则返回B的值
not A :如果A为True,返回False,否则返回True
0 and 2 #01 and 2 #21 and 0 #00 or 2 #21 or 2 #1not 1 #Falsenot 0 #True
位运算符:
将数字看成二进制,直接对二进制数字的每一位进行运算,返回十进制结果
& :位与运算符,按参与运算的两个值,如果相应位的值都为1,则该位的结果为1
|:位或运算符,如果相应位的值有一个为1,则该位的结果为1
^ :位异或运算符,如果相应位的值相异时,则该位的结果为1
~ :位取反运算符,把数据的二进制位取反,即把1变为0,把0变为1
<< :左移动运算符,运算数的各二进位全部左移若干位,由<< 右边的数指定移动的位数,高位丢弃,低位补0
>> :右移动运算符,把>> 左边的运算数各二进位全部右移若干位,>> 右边的数指定移动的位数
sum(iterable, /, start=0)
从 start 开始自左向右对 iterable 的项求和并返回总计值。iterable 的项通常为数字,而 start 值则不允许为字符串
dt = {"A":4,"B":3,"C":2,"D":1,"F":0}list1 = []list2 = []while True:s = input()if s == "False":breakelse:s1 = int(input())list1.append(dt[s] * s1)list2.append(s1)print('%.2f'%(sum(list1)/sum(list2)))
round(number[, ndigits])
返回 number 舍入到小数点后 ndigits 位精度的值。如果 ndigits 被省略或为 None,则返回最接近输入值的整数。
对于支持 round() 的内置类型,值会被舍入到最接近的 10 的负 ndigits 次幂的倍数;如果与两个倍数的距离相等,则选择偶数 (因此,round(0.5) 和 round(-0.5) 均为 0 而 round(1.5) 为 2)。
round(5.5) #6round(4.5) #4round(3.2,2) #3.2round(6.675,2) #6.67round(6.575,2) #6.58#两者舍入不同的原因是由于大多数十进制小数实际上都不能以浮点数精确地表示。
确保四舍五入精度严格的一种方法:
Decimal(value="0", context=None)
value 可以是整数,字符串,元组,float ,或另一个 Decimal 对象。如果没有给出 value,则返回 Decimal('0')。
from decimal import Decimala = Decimal('23.3456').quantize(Decimal('0.01'),rounding='ROUND_HALF_UP')print(a) #23.35b = Decimal('7.325').quantize(Decimal('1.'), rounding='ROUND_HALF_UP')print(b) #7
tuple([iterable]) 列表同理list([iterable])
可以用多种方式构建元组:
使用一对圆括号来表示空元组: ()
使用一个后缀的逗号来表示单元组: a, 或 (a,)
使用以逗号分隔的多个项: a, b, c or (a, b, c)
使用内置的tuple() 或 tuple(iterable)
构造器将构造一个元组,其中的项与 iterable 中的项具有相同的值与顺序。iterable 可以是序列、支持迭代的容器或其他可迭代对象。如果 iterable 已经是一个元组,会不加改变地将其返回。例如,tuple('abc') 返回 ('a', 'b', 'c') 而 tuple( [1, 2, 3] ) 返回 (1, 2, 3)。如果没有给出参数,构造器将创建一个空元组 ()。
细节点记录:
df = [[1,2,3],[4,5,6],[7,8,9]]for x,y,z in df[0],df[1],df[2]:print(x,y,z)输出:1 2 34 5 67 8 9#此处会把df[0],df[1],df[2]当作一个元组,#然后将每一项的三个值分别赋给x,y,z
zip(*iterables)
创建一个聚合了来自每个可迭代对象中的元素的迭代器。
返回一个元组的迭代器,其中的第 i 个元组包含来自每个参数序列或可迭代对象的第 i 个元素。当所输入可迭代对象中最短的一个被耗尽时,迭代器将停止迭代。当只有一个可迭代对象参数时,它将返回一个单元组的迭代器。不带参数时,它将返回一个空迭代器
a = [1,2,3]b = zip(a)list(b)输出:[(1,), (2,), (3,)]
a = [1,2,3]b = [4,5,6,7]c = zip(a,b)# dict(c) #{1: 4, 2: 5, 3: 6}# list(c) #[(1, 4), (2, 5), (3, 6)]# tuple(c) #((1, 4), (2, 5), (3, 6))x,y = zip(*zip(a,b))# list(x) #[1, 2, 3]list(y) #[4, 5, 6]
zip()
与 *
运算符相结合可以用来拆解一个列表
count(sub[, start[, end]]) #列表可用
返回子字符串 sub 在 [start, end] 范围内出现的次数。可选参数 start 与 end 会被解读为切片表示法。
var = input()var_dict = {}for i in var:var_dict[i] = var.count(i)print(var_dict)
abs(x)
返回一个数的绝对值。参数可以是整数、浮点数或任何实现了 __abs__() 的对象。如果参数是一个复数,则返回它的模
max(iterable, *[, key, default]) #min() 同理返回最小元素
max(arg1, arg2, *args[, key]) #min() 同理返回最小元素
返回可迭代对象中最大的元素,或者返回两个及以上实参中最大的。
如果只提供了一个位置参数,它必须是非空 iterable ,返回可迭代对象中最大的元素;如果提供了两个及以上的位置参数,则返回最大的位置参数。
有两个可选只能用关键字的实参。key 实参指定排序函数用的参数,如传给 list.sort() 的。default 实参是当可迭代对象为空时返回的值。如果可迭代对象为空,并且没有给 default ,则会触发ValueError。
如果有多个最大元素,则此函数将返回第一个找到的
num_list = list(map(int,input().split()))print(max(num_list),min(num_list),sep='\n')
ord(c)
对表示单个 Unicode 字符的字符串,返回代表它 Unicode 码点的整数(ASCII码)。例如 ord('a') 返回整数 97, ord('€') (欧元符号)返回 8364 。这是 chr() 的逆函数,chr(97)
返回字符串 'a'
hex(x)
将整数转换为以“0x”为前缀的小写十六进制字符串。x 为 int 对象。
如果想要去除带前缀的"0x" 或者将十六进制字符串大写,可以采用格式化输出,还有format()或者加 " f "
'%x'%234 ,'%#x'%234 ,'%#X'%234 ,'%X'%234#('ea', '0xea', '0XEA', 'EA')
float.hex()
将浮点数转化为以"0x"为前缀和尾随"p"加指数的十六进制字符串
print((12.23).hex()) #0x1.875c28f5c28f6p+3
oct(x)
将整数转换为以"0o"为前缀的八进制字符串。x 为 int 对象。
如果想要去除带前缀的"0o" ,可以采用格式化输出
'%#o' % 10, '%o' % 10 #('0o12', '12')format(10, '#o'), format(10, 'o') #('0o12', '12')f'{10:#o}', f'{10:o}' #('0o12', '12')
bin(x)
将整数转化为一个前缀为“0b”的二进制字符串。x 为 int 对象
bin(3) #输出'0b11'
str.find(sub[, start[, end]])
返回子字符串 sub 在 s[start:end] 切片内被找到的最小索引(指的是按str排的索引)。可选参数 start 与 end 会被解读为切片表示法。如果 sub 未被找到则返回 -1。
var = 'NiuNiu won the prize!'print(var.find('the',9)) #11
str.join(iterable)
将iterable中的字符串按指定的str字符串拼接成新字符串,iterable中不能包含非字符串值,否则报错TypeError
s = input()n = []# while True: #一种方法# if s == '0':# break# else:# n.append(s)# s = input()# print(' '.join(n))while s != '0': #第二种方法n.append(s)s = input()print(' '.join(n))
hasattr(object, name)
该实参是一个对象和一个字符串。如果字符串是对象的属性之一的名称,则返回 True,否则返回 False。(此功能是通过调用 getattr(object, name) 看是否有 AttributeError 异常来实现的。)
setattr(object, name, value)
此函数与 getattr() 两相对应。其参数为一个对象、一个字符串和一个任意值。字符串指定一个现有属性或者新增属性。函数会将值赋给该属性,只要对象允许这种操作。例如,setattr(x, 'foobar', 123) 等价于 x.foobar = 123。
class Employee():def __init__(self,name,salary):self.name = nameself.salary = salarydef printclass(self):print(f"{self.name}'salary is {self.salary}, and his age is {self.age}")name = input()salary = int(input())age = int(input())e = Employee(name,salary)print(hasattr(e,'age'))#判断e对象是否有为age的属性,有返回True,否则Falsesetattr(e,'age',age)#为e对象添加名为age的属性及其对应的值e.printclass()
enumerate(iterable, start=0)
返回一个枚举对象。iterable 必须是一个序列,或 iterator,或其他支持迭代的对象。enumerate() 返回的迭代器的 __next__() 方法返回一个元组,里面包含一个计数值(从 start 开始,默认为 0)和通过迭代 iterable 获得的值。
seasons = ['Spring', 'Summer', 'Fall', 'Winter']print(list(enumerate(seasons)))print(list(enumerate(seasons,1)))输出:[(0, 'Spring'), (1, 'Summer'), (2, 'Fall'), (3, 'Winter')][(1, 'Spring'), (2, 'Summer'), (3, 'Fall'), (4, 'Winter')]seasons = ['Spring', 'Summer', 'Fall', 'Winter']for index,value in enumerate(seasons,1):#索引从1开始计数print(index,value)输出:1 Spring2 Summer3 Fall4 Winter
条件判断语句和循环语句
条件语句:
if 条件语句1:语句块1 #条件为真时执行elif 条件语句2:语句块2 #条件为真时执行else:语句块3 #条件为假时执行
continue:
跳过当前循环的剩余语句,继续执行下一个循环
n = 0while n < 5:n += 1if n == 3:continueprint('I am wrong %d'%n)else:print(n)输出:I am wrong 1I am wrong 2I am wrong 4I am wrong 55
break:
结束当前的整个循环,循环对应的else也不会执行
n = 0while n < 5:n += 1if n == 2:continueif n == 4:breakprint('I am wrong %d'%n)else:print(n)输出:I am wrong 1I am wrong 3
循环语句:一般不建议写else语句
for iter in iters:#接收可迭代对象作为参数,每次迭代其中的一个元素循环语句块else:语句块while 条件语句:循环语句块 #条件为真时执行else:语句块 #条件为假时执行
用递归算法实现第n个月兔子的数量:
兔子的数量以这样的方式增长:每个月的兔子数量等于它前一个月的兔子数量加它前两个月的兔子数量,即f(n)=f(n-1)+f(n-2)。假设第1个月的兔子有2只,第2个月的兔子有3只,你能使用递归的方法求得第n个月的兔子有多少只吗?
def rabbit_num(n):num_list = [2,3]if n <= 2:return num_list[n-1]else:return rabbit_num(n-1) + rabbit_num(n-2)n = int(input())print(rabbit_num(n))
定义类实现班级管理:
牛牛的Python老师为了更好地管理班级,利用一个类Student来管理学生,这个类包含了学生姓名(str)、学号(str)、分数(int)、每次作业等级(list[str])等信息。请你帮助牛牛的老师实现这样一个类,并定义构造方法实现初始化,定义打印函数实现打印学生的姓名、学号、分数、提交作业的次数、每次作业的等级。
类中的 self 代表类的实例,是通过类创建的实例 (注意,在定义类时这个实例我们还没有创建,它表示的我们使用类时创建的那个实例)
实例属性每个实例各自拥有,互相独立,而类属性有且只有一份。实例属性访问优先级比类属性高,所以我们访问时优先访问实例属性,它将屏蔽掉对类属性的访问。
class Student():def __init__(self,name,number,score,grade):self.name = nameself.number = numberself.score = int(score)self.grade = grade.split()def info(self):print(f"{self.name}'s student number is {self.number}, and his grade is {self.score}. He submitted {len(self.grade)} assignments, each with a grade of {' '.join(self.grade)}")a = Student('menkim','12345','90','A B C')a.info()
定义函数相关知识
实参和形参:
在调用函数时传给函数或方法的值称为实参,形参指的是出现在函数定义中的名称。
形参分为五种类型:
positional-or-keyword:位置或关键字,关键字形参也叫作命名形参。指定一个可以作为位置参数传入也可以作为关键字参数传入的实参。这是默认的形参类型。分别对应下面的foo,bar,在关键字参数里会传入默认值,也称为默认值参数
def func(foo, bar=None): ...
positional-only:仅限位置,指定一个只能通过位置传入的参数,仅限位置形参可通过在函数定义的形参列表中它们之后包含一个 / 字符来定义,例如下面的 posonly1 和 posonly2:
def func(posonly1, posonly2, , positional_or_keyword): ...
keyword-only:仅限关键字,指定一个只能通过关键字传入的参数。仅限关键字形参可通过在函数定义的形参列表中包含单个可变位置形参或者在多个可变位置形参之前放一个 * 来定义,例如下面的 kw_only1 和 kw_only2:
def func(arg, *, kw_only1, kw_only2): ...
var-positional:可变位置,指定可以提供由一个任意数量的位置参数构成的序列(附加在其他形参已接受的位置参数之后)。这种形参可通过在形参名称前加缀 * 来定义,例如下面的 args:
var-keyword:可变关键字,指定可以提供任意数量的关键字参数(附加在其他形参已接受的关键字参数之后)。这种形参可通过在形参名称前加缀 ** 来定义,例如下面的 kwargs。
def func(*args, **kwargs): ...
在函数定义形参时为了好理解和调用,一般位置顺序可按从左到右分别为:
必选参数,关键字参数、默认值参数,可变位置,可变关键字
def func(foo,bar=None,*args,**kwargs): ...
在函数调用中传入实参时有两种写法,分别为位置参数和关键字参数调用,函数在调用时关键字参数必须在位置参数后面:
位置参数:不属于关键字参数的参数。位置参数在调用时可出现于参数列表的开头或者作为前面带有 * 的 iterable 里的元素被传入。在函数定义时该参数指定了默认值也可以按顺序用位置参数的写法调用,举例来说,3 和 5 在以下调用中均属于位置参数:
def func(name,age,score=90): ...func(3, 5, 80)func(*(3, 5), 80) #*后面是可迭代对象,例如列表、元组、集合等#实际上 * 操作符的作用是将可迭代对象解包出来传递参数#下面的 ** 操作符也是同样的作用
关键字参数: 在函数调用中前面带有标识符(例如 name=)或者作为包含在前面带有 ** 的字典里的值传入。即使在函数定义时该参数没有指定默认值,也可以用关键字参数来调用;举例来说,3 和 5 在以下对 complex() 的调用中均属于关键字参数:
def func(name,age): ...func(name=3, age=5)func(**{'name': 3, 'age': 5})#**后面要为mapping#例如dict,collections.defaultdict,collections.OrderedDict等
注意事项:
*expression 句法可能出现于显式的关键字参数 之后,但它会在关键字参数(以及任何 **expression 参数)之前被处理:
def f(a, b):print(a, b)# f(b=1, *(2,)) # 2 1# f(a=1, *(2,))# TypeError: f() got multiple values for argument 'a'f(1, *(2,)) # 1 2
一般**kwargs中的键不能与参数列表中其他的参数同名,只有仅限位置形参(位于 之前的参数)的名称可以在 **kwargs 中使用,而不产生歧义,如下:
def foo(name, **kwargs):return 'name' in kwargsfoo(2,**{'name':3})#报错:TypeError: foo() got multiple values for argument 'name'
def foo(name,/ , **kwargs):print(name,kwargs['name'])return 'name' in kwargsfoo(2,**{'name':3}) #可以使用,不报错输出:2 3True
可变位置参数*args和可变关键字参数**kwargs的用法:
def cheeseshop(kind, *arguments, **keywords):print("-- Do you have any", kind, "?")print("-- I'm sorry, we're all out of", kind)for arg in arguments:print(arg)print("-" * 40)for kw in keywords:print(kw, ":", keywords[kw])cheeseshop("Limburger", "It's very runny, sir.","It's really very, VERY runny, sir.",shopkeeper="Michael Palin",client="John Cleese",sketch="Cheese Shop Sketch")print("\n") #两行 ,上下两种调用方法输出一致cheeseshop(*("Limburger", "It's very runny, sir.","It's really very, VERY runny, sir."),**{"shopkeeper":"Michael Palin","client":"John Cleese","sketch":"Cheese Shop Sketch"})
在传入参数时,对于可变位置参数*args来说,会将传入的任何额外的位置参数存在元组中,默认是一个空元组;对于**kwargs来说,会将传入的任何额外的关键字参数存到有序映射mapping中,默认为一个相同类型的空映射:
def foo(*args, **kwargs):a = argsb = kwargsprint(args,kwargs)print(a,b)for i in args:print(i,end=' ')for j in kwargs:print(j,end=' ')#foo(*[2,3],**{'hah':4,'www':6}) #实际传入了四个参数,可以被使用foo(2,3,'hah'=4,'www'=6) #还可以这样写输出:#args 被初始化为一个元组接收额外的位置参数(2, 3) {'hah': 4, 'www': 6}(2, 3) {'hah': 4, 'www': 6}2 3 hah www
注意事项:
当函数形参默认值为可变对象,例如列表、字典、类实例等时,如果函数修改了该对象,例如向列表中添加了一项,则实际上该默认值也会被修改:
def f(a, L=[]):L.append(a)return Lprint(f(1))print(f(2))print(f(3))输出:[1][1, 2][1, 2, 3]
绕过此问题的一个方法是使用 None 作为默认值,并在函数体中显式地对其进行测试,例如:
def f(a, L=None):if L is None:L = []L.append(a)return Lprint(f(3))print(f(4))输出:[3][4]
将时间戳转换为标准utc日期时间格式的一个方法:
from datetime import datetimedt_o = datetime.fromtimestamp(1233456)print(dt_o)print(dt_o.year,dt_o.month,dt_o.day,dt_o.hour, dt_o.minute, dt_o.second)输出:1970-01-15 14:37:361970 1 15 14 37 36
datetime库中几个类对象的用法:
datetime对象:包含来自 date 对象和 time 对象的所有信息的单一对象
datetime(year, month, day, hour=0, minute=0, second=0, microsecond=0, tzinfo=None, *, fold=0)
timedelta对象:表示两个 date 或者 time 的时间间隔
timedelta(days=0, seconds=0, microseconds=0, milliseconds=0, minutes=0, hours=0, weeks=0)
time对象:代表某日的(本地)时间,它独立于任何特定日期
time(hour=0, minute=0, second=0, microsecond=0, tzinfo=None, *, fold=0)
from datetime import datetime,timeb = datetime(2022,4,9,0,0,0)a = timedelta(seconds=3661.34,minutes=10,weeks=1)c = b + aprint(c.day,c.hour,c.minute,c.second)print(datetime.today())print(time(microsecond=5))a输出:16 1 11 12022-09-07 22:28:48.45468900:00:00.000005datetime.timedelta(days=7, seconds=4261, microseconds=340000)
时间戳转换时的UTC标准时间和北京时间问题:
在本地机器上转化一个时间戳时,会默认转化为本地时间,而要将时间戳转换为UTC标准时间需要加一个参数
from datetime import datetime,timezonea = datetime.fromtimestamp(0) #本地时间b = datetime.fromtimestamp(0,tz=timezone.utc) #UTC标准时间print(a,b,sep='\n')输出:1970-01-01 08:00:001970-01-01 00:00:00+00:00
给出三角形的三个边长a,b,c ,求三角形的周长和面积:
求面积可以用海伦公式:
p = (a + b + c)/2
面积 S 为 p*(p-a)*(p-b)*(p-c)的开方
math.sqrt(x):返回x 的平方根
import matha,b,c = map(int,input().split())p = (a + b + c)/2s = math.sqrt(p*(p-a)*(p-b)*(p-c)) #面积值print('circumference=%.2f'%(p*2),'area=%.2f'%s,sep=' ')
求两个正整数的最大公约数和最小公倍数的一个方法:辗转相除法
#欧几里得的辗转相除法:两正整数a,b相除的余数r(a%b)如果为零,则除数b为#两数的最大公约数,如果余数r不为零,则将b作为被除数,余数r作为除数,继续b%r得到#余数,一直如此迭代下去,知道余数为0,则将此次的余数作为a,b的最大公约数#a,b的最小公倍数为(a*b)/最大公约数n,m = map(int,input().split())a,b = n,mr = a % bwhile r != 0:a,b = b,rr = a % bd = (n*m)//b #b为最大公约数,d为最小公倍数print(b+d) #时间复杂度约为O(logN)
注意事项:当浮点数整数位大于16位时会采用科学计数法的表现形式,这个时候再用 int() 转化为整数的时候会出现失真的情况
HTTP状态码:
http_status = {'200':'OK','202':'Accepted','400':'Bad Request','403':'Forbidden','404':'Not Found','500':'Internal Server Error','502':'Bad Gateway'}while True:try:n = input()print('%s'%http_status[n])except:break
判断三个数是否可以组成一个三角形的一种方法:
满足两短边之和大于最大边或者采用穷举(任意两边之和大于第三边)
while True:try:a,b,c = map(float,input().split())if a + b > c and a + c > b and b + c > a:if a == b == c:print('Equilateral triangle!')elif a == b or a == c or b == c:print('Isosceles triangle!')else:print('Ordinary triangle!')else:print('Not a triangle!')except:break
获取某年某月的天数方法之一:
import calendarprint(calendar.monthrange(2022,8))print(calendar._monthlen(2022,8))输出:(0, 31) #0指的是星期一,0-6分别指星期一到星期日31
一种编写简易计算器的方法,该方法只能实现两个正数的加减乘除运算:
msg = input()try:for i in msg:if i.isnumeric() or i == '.':passelse:a,b = msg.split(i)print('%.4f%s%.4f=%.4f'%(eval(a),i,eval(b),eval(msg)))except SyntaxError as e:print('Invalid operation!')except ZeroDivisionError as e:print('Wrong!Division by zero!')
利用等差数列求1到n的和:
n = int(input())total = (1+n)*n//2print(total)
判断三位数的整数中的质数有多少个计算方法之一:
n = 0for i in range(100,1000):flag = 1 #做个标记for j in range(2,int(i**0.5)+1):if i%j == 0:flag = 0breakif flag == 1:n += 1print(n)
用筛选法求n以内的质数(素数)。筛选法求解过程为:将2~n之间的正整数放在数组内存储,将数组中2之后的所有能被2整除的数删除,再将3之后的所有能被3整除的数删除 ,以此类推,直到n为止。数组中剩下的数即为质数:
def prime_Number(n):ls = [i for i in range(2, n + 1)]for i in range(2, n + 1):if i not in ls:continueelse:l = ls.index(i)# 按照堆栈的思想循环,不破坏原来的列表的索引for j in range(len(ls) - 1, l, -1):if ls[j] % i == 0:# ls.remove(ls[j])ls.pop(j)print(*ls)print(n - 1 - len(ls))while True:try:n = int(input())prime_Number(n)except:break
str.rjust(width[, fillchar]) #字符串固定长度填充的方法
返回长度为 width 的字符串,原字符串在其中靠右对齐。 使用指定的 fillchar 填充空位 (默认使用 ASCII 空格符)。 如果 width 小于等于 len(s) 则返回原字符串的副本。
str.ljust(width[, fillchar]) #原字符串在其中靠左对齐
'menkim'.rjust(8) #' menkim''menkim'.ljust(8) #'menkim '
str.center(width[, fillchar])
返回长度为 width 的字符串,原字符串在其正中。 使用指定的 fillchar 填充两边的空位(默认使用 ASCII 空格符)。 如果 width 小于等于 len(s) 则返回原字符串的副本。
'menkim'.center(8) #' menkim '
字符串靠左靠右居中输出的另一种写法:
#靠左'{:<6}'.format(12) #等效于'{:<{}}'.format(12,6)和f'{12:<6}'输出:'12 '#靠右'{:>6}'.format(12)输出:' 12'#居中'{:^6}'.format(12)输出:' 12 '
牛客网中实现超级圣诞树的方法之一:https://www.nowcoder.com/practice/470d26c9a73e4e17be8cc45cac843423
# 按照对称的思想来解决这个问题# 用列表存储每一行,再循环居中打印出每一行即可得到超级圣诞树的树枝部分# 枝干部分按照输入的值循环居中打印*即可# 关键点在于找到空格的规律和最大行的宽度n = int(input())# 构造基本单元ls = ["*", "* *", "* * *"]# 定义一个函数用于往列表中插入数据def Write(ls):length = len(ls) #因为列表是可变的,所以要将长度定下来for i in range(length):ls.append(ls[i] + " " * (2 * length - 1 - 2 * i) + ls[i])return ls# 将树枝存入列表中for j in range(1, n):Write(ls)# 求出最大宽度width = 6 * (2 ** (n - 1)) - 1# 输出树枝for i in range(len(ls)):print(ls[i].center(width))# 输出树干for _ in range(n):print("*".center(width))
用列表创建伪二维矩阵并找到里面对应索引元素的方法之一:
#创建n行m列的矩阵n,m = map(int,input().split())ls = [[0 for _ in range(m)] for _ in range(n)]for i in range(n):ls[i] = list(map(int,input().split()))#找到x行y列的元素x,y = map(int,input().split())print(ls[x-1][y-1])
暂时先写这么多,下一篇将重点介绍python数据分析相关的第三方工具库和一些简单的机器学习相关知识。




