python3常用技巧

整数的最大最小表示

import sys
max = sys.maxsize
min = -sys.maxsize -1

浮点数最大最小

float('inf')
float('-inf')

数组初始化

list1 = [n for n in range(1,6)] # 一维
list2 = [['a' for n in range(4)] for i in range(3)]# 二维3*4
list3 = ['b'] * 4 #一维1*4

数组复制

list1 = ['Google', 'Runoob', 'Taobao', 'Baidu']
list0 = list1[:]   # 方法0, 用切片,浅复制
list2 = list1.copy() ## 方法1
list3 = list(list1) ##方法2
list4=copy.copy(list1) ##方法3
list5=copy.deepcopy(list1) ##方法4, 深复制(唯一方法)

python的参数传递

  • 值传递还是引用传递
    Python参数传递统一使用的是引用传递方式。因为Python对象分为可变对象(list,dict,set等)和不可变对象(number,string,tuple等),当传递的参数是可变对象的引用时,因为可变对象的值可以修改,因此可以通过修改参数值而修改原对象,这类似于C语言中的引用传递;当传递的参数是不可变对象的引用时,虽然传递的是引用,参数变量和原变量都指向同一内存地址,但是不可变对象无法修改,所以参数的重新赋值不会影响原对象,这类似于C语言中的值传递。
    总结:可变对象是引用传递(class对象,list,dict,set等),不可变对象(number,string,tuple等)是值传递
  • 从编译原理本质来说,其实都是值传递。可变对象参数其实是引用

python处理输入

传送门

python处理输出

  1. 打印数组,去掉中括号
# 数组元素是str
print(' '.join(s))
# 数组元素不是str
print(' ',join(map(str, nums))
# 通过控制print不换行实现
for i in rang(len(s)):
    print(s[i], end=' ')

求和

ls = [1,2,3]
ans = sum(ls)

生成随机数

random.randrange(0, 10, 1) ##这三个参数类似range(0, 10, 1)
random.random() ##返回 [0.0, 1.0) 范围内的下一个随机浮点

python调试中的输入重定向

为了加快调试速度,避免每次运行都手动输入测试用例,应该将测试用例写在文件中,直接从文件中读取输入即可。下面介绍两种方式,假设测试用例在in.txt文件中

  • 用命令方式
python main.py < in.txt
  • 在pycharm中调试时,重定向输入
  1. 前提要求:
    pycharm版本>=2020.3
    pycharm版本>=2020.3
    pycharm版本>=2020.3
  2. 运行依次main.py文件,然后点击"edit configuration"
  3. 在弹出的配置界面勾选'Redirect input from', 然后选择输入的文件即可


    image.png

python判断字符串类型(数字、字母)

str_1 = "123"
str_2 = "Abc"
str_3 = "123Abc"
 
#用isdigit函数判断是否数字
print(str_1.isdigit())
Ture
 
#用isalpha判断是否字母
print(str_2.isalpha())
Ture    
 
#isalnum判断是否数字和字母的组合
print(str_1.isalnum())    
Ture
注意:如果字符串中含有除了字母或者数字之外的字符,比如空格,也会返回False

python整数除法的注意事项

除法有 “/” 以及 “//” 两种,前一种的结果如果除不尽则会以小数作为结果,后一种的结果是整除,结果一定是整数。但是这个整除是向下取整,而且有点诡异,与cpp有不同之处。具体为:在结果是正整数时,python与cpp一致,但是当结果是负数时,则python是真“向下取整”的,举例说明如下:

a = 1//-100   # a=-1 但是在cpp里面 a=1/-100结果等于0

要得到cpp的结果,即绝对值向下取整,用int()强转即可

a = 1//-100
a = int(a)   # a结果即为0

python取余的注意事项

余数的定义有两种,计算机领域的余数与数学上的余数其实是有差异的

  • 定义1:如果a和d是两个自然数,d非零,可以证明存在两个唯一的整数 q 和 r,满足a=qd+r且0 ≤ r < d(其中q为商,r为余数)。
    定义1一般作为数学中的取余法则,即两个数取余,余数总是为正数。
  • 定义2:如果a 与d 是整数,d 非零,那么余数 r 满足这样的关系:a = qd + r , q 为整数,且0 ≤ |r| < |d|。定义2取余的结果就会导致出现两个余数了,比如5%(-3) = (-3)x(-1)+2 = (-3)x(-2)-1,所以这里的余数2和-1都满足定义。
    我们把2称为正余数,-1成为负余数。通常,当除以d 时,如果正余数为r1,负余数为r2,那么有r1 = r2 + d。
  • 那么在计算机算余数的时候是如何取得呢? 实际上计算机取余的计算与整数除法直接相关,a%d余数计算公式为:
    r=a-d*[a/d]
    c++语言中的a/d整数除法结果是尽量靠近0,而python中则是向下取整。所以python的负数取余结果也会很诡异。下面举例说明
# 在python中的结果如下
a = 1%-100 # a=-99, 因为1//-100 = -1, r=1-(-100)*(-1)=-99
b = -1%100 # a=99, 因为-1//100 = -1, r=-1-100*(-1) = 99
c = -1%-100 # a=-1, 因为-1//-100 = 0, r=-1-(-100)*0 = -1

但是在cpp中上述结果为:a=1, b=-1, c=-1. 因为商均为0。
总结:取余操作与整除的计算直接相关。因此python要实现与cpp类似的计算结果,应该从计算公式入手,把整数除法的结果计算正确,再套计算公式得出结果,即:

r = a - d*int(a/d)

python输出的格式控制

  1. 用%作为格式控制符(与C语言一致,做题常用)


    image.png
  2. 用format()函数
>>> 'Hello, {0}, 成绩提升了 {1:.1f}%'.format('小明', 17.125)
'Hello, 小明, 成绩提升了 17.1%'
  1. 用f'xxx',替换{}中的变量
>>> r = 2.5
>>> s = 3.14 * r ** 2
>>> print(f'The area of a circle with radius {r} is {s:.2f}')
The area of a circle with radius 2.5 is 19.62

进制转换

  1. 读入指定进制的字符串
a = int('10101', base=2)
b = int('77', base=8)
c = int('FF', base=16)
# 当然 进制的字符串前面是有前缀的
# 2:0b
# 8:0o
# 16:0x
a = int('0b10101', base=2)
b = int('0o77', base=8)
c = int('0xFF', base=16)
  1. 将整数转换成指定进制的字符串
# octonary [ˈɑːktəˌneri]
# hexadecimal [ˌheksəˈdesɪml]
num = 15
a = bin(num)
b = oct(num)
c = hex(num)
# a b c 都是有前缀的,打印如下
>>> a
'0b1111'
>>> b
'0o17'
>>> c
'0xf'
>>>

单字符与编码转换

# char转编码的整数
a= 'A'
i = ord(a)
# 编码的整数转char
b = chr(i + 1)

排列组合

# -*- encoding=utf-8 -*-
from itertools import permutations
 
test_data = list('234')
 
""" 排列 """
for item in permutations(test_data, 2):
    print(item)
 
# 输出
"""
('2', '3')
('2', '4')
('3', '2')
('3', '4')
('4', '2')
('4', '3')
"""

# -*- encoding=utf-8 -*-
from itertools import combinations
 
test_data = list('1234')
 
""" 组合 """
for item in combinations(test_data, 3):
    print(item)
 
 
# 输出
"""
('1', '2', '3')
('1', '2', '4')
('1', '3', '4')
('2', '3', '4')
"""

维护有序列表

bisect模块实现了一个算法来向列表中插入元素,同时仍保持列表有序。

a = [1, 3, 3, 5]
x = 3
p = bisect.bisect_left(a, x, lo=0, hi=len(a)) # 找到保持列表有序的x的插入位置,当列表中有x元素时,则插入位置在x的最左侧。p=1
bisect.bisect_right(a, x, lo=0, hi=len(a)) # 找到保持列表有序的x的插入位置,当列表中有x元素时,则插入位置在x的最右侧。 p=3
# 当列表中没有x元素时,上述两个方法的返回值相同
# 上述两个方法只是返回插入的位置,下面的两个方法则是实际插入元素。时间复杂度为O(n),因为list插入操作的复杂度更大。
bisect.insort_left(a, x, lo=0, hi=len(a))
bisect.insort_right(a, x, lo=0, hi=len(a))

在python console中查使用文档

使用help()方法即可. 例如要查询list的使用方法,有哪些函数:

>>> help()

Welcome to Python 3.8's help utility!

If this is your first time using Python, you should definitely check out
the tutorial on the Internet at https://docs.python.org/3.8/tutorial/.

Enter the name of any module, keyword, or topic to get help on writing
Python programs and using Python modules.  To quit this help utility and
return to the interpreter, just type "quit".

To get a list of available modules, keywords, symbols, or topics, type
"modules", "keywords", "symbols", or "topics".  Each module also comes
with a one-line summary of what it does; to list the modules whose name
or summary contain a given string such as "spam", type "modules spam".

help>list
Help on class list in module builtins:

class list(object)
 |  list(iterable=(), /)
 |
 |  Built-in mutable sequence.
 |
 |  If no argument is given, the constructor creates a new empty list.
 |  The argument must be an iterable if specified.
 |
 |  Methods defined here:
 |
 |  __add__(self, value, /)
 |      Return self+value.
 |
 |  __contains__(self, key, /)
 |      Return key in self.
 |
 |  __delitem__(self, key, /)
 |      Delete self[key].
 |
 |  __eq__(self, value, /)
 |      Return self==value.
 |
 |  __ge__(self, value, /)
 |      Return self>=value.
 |
 |  __getattribute__(self, name, /)
 |      Return getattr(self, name).
 |
 |  __getitem__(...)
 |      x.__getitem__(y) <==> x[y]
 |
 |  __gt__(self, value, /)
 |      Return self>value.
 |
 |  __iadd__(self, value, /)
 |      Implement self+=value.
 |
 |  __imul__(self, value, /)
 |      Implement self*=value.
 |
 |  __init__(self, /, *args, **kwargs)
:
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,636评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,890评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,680评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,766评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,665评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,045评论 1 276
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,515评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,182评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,334评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,274评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,319评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,002评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,599评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,675评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,917评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,309评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,885评论 2 341

推荐阅读更多精彩内容

  • 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。 函数能提高应用的模块性,和代码的重复利用率。你...
    Java丶python攻城狮阅读 440评论 0 1
  • 浅谈Python3中函数参数传递方式 之前在看北理工嵩天等老师的python3的课程,在第五周中老师讲到了函数的调...
    吕归尘的2018阅读 8,302评论 1 6
  • Python3 函数 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。函数能提高应用的模块性,和...
    小卢子_1093阅读 193评论 0 1
  • 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。函数能提高应用的模块性,和代码的重复利用率。你已...
    阿靖哦阅读 194评论 0 0
  • 基本语法 输入输出 print / input 如果字符串里面有很多字符都需要转义,就需要加很多\,为了简化,Py...
    bitzoo阅读 1,649评论 0 0