百分之九十的人不知道?在Python中f-string的几个技巧

Posted Python学习

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了百分之九十的人不知道?在Python中f-string的几个技巧相关的知识,希望对你有一定的参考价值。

f-string想必很多Python用户都基础性的使用过,作为Python3.6版本开始引入的特性,通过它我们可以更加方便地向字符串中嵌入自定义内容,但f-string真正蕴含的功能远比大多数用户知道的要丰富,今天我们就来一起get它们~

最基础用法

f-string最基础的用法很简单,如下例所示,在前缀f的字符串中向{}内直接填入要嵌入的值、变量或计算表达式:

print(f\'1+1 = {2}\')
#输出:1+1 = 2

a=1 + 1
print(f\'1+1 = {a}\')
#输出:1+1 = 2

print(f\'1+1 = {1+1}\')
#输出:1+1 = 2

自记录表达式

从Python3.8版本开始,为f-string引入了自记录表达式,使得我们可以按照下面的写法快速输出一些计算表达式:

import math
a = 8
print(f\'{math. log(8) = }\')

#输出:math. log(8) = 2.0794415416798357

多行f-string

通过最外层包裹小括号,我们可以像下面这样非常灵活地撰写多行f-string:

a = 1
b = 2
c = 3
s = (
    f\'{a = }\\n\'
    f\'{b = }\\n\'
    f\'{c = }\\n\'
)
print(s)

#输出:
a = 1
b = 2
c = 3

在f-string中格式化日期

针对日期类型的变量,我们可以参考下面的方式,直接在f-string中快速地进行格式化:

\'\'\'
学习中遇到问题没人解答?小编创建了一个Python学习交流群:531509025
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
\'\'\'
import datetime
now = datetime.datetime.now()
print(f\'{now:%Y年%m月%d号%H点%M分%S秒}\')

#输出:
2021年10月18号16点45分58秒

控制浮点数精度

在f-string中我们可以按照下列方式灵活地控制浮点数的小数位数:

import math
pi = math.pi
print(f\'{pi: .3f}\')
print(f\'{pi:.8f}\')

#输出
3.142
3.14159265

标准化显示宽度

当我们需要对f-string打印内容的显示最小宽度进行限制时,譬如打印出类似表格的结构,可以参考下面的例子:

for x in range(1,11):
    print(f\'{x:02}|{x**2:3}/{x**5:6}\')

#输出
01|  1/     1
02|  4/    32
03|  9/   243
04| 16/  1024
05| 25/  3125
06| 36/  7776
07| 49/ 16807
08| 64/ 32768
09| 81/ 59049
10|100/100000

修改为左对齐

f-string默认为右对齐,就像上面的例子,但我们可以像下面这样使用<修改显示模式为左对齐:

\'\'\'
学习中遇到问题没人解答?小编创建了一个Python学习交流群:531509025
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
\'\'\'
for x in range(1,11):
    print(f\'{x:<2}|{x**2:<3}|{x**5:<6}\')

#输出
1 |1  |1     
2 |4  |32    
3 |9  |243   
4 |16 |1024  
5 |25 |3125  
6 |36 |7776  
7 |49 |16807 
8 |64 |32768 
9 |81 |59049 
10|100|100000

设置科学计数法格式

我们可以参考下面的方式实现指定位数的科学计数法显示方式:

import math
pi = math.pi
print(f\'{pi*100:.10e}\')

#输出
3.1415926536e+02

控制有效数字位数

通过下面的方式,我们还可以控制所显示数字的有效数字位数,即从左开始第一个不为0的数字往右一共显示的个数,当位数低于整数部分时会自动变成科学计数法格式:

a=1312.3123123123123
print(f\'{a:.10g}\')
#输出:1312.312312

a=1312.3123123123123
print(f\'{a:.3g}\')
#输出:1.31e+03

会了吗?

百分之九十的程序员都掌握的C#技巧

1.C#匿名方法

【Anonymous methods】匿名方法,一般使用匿名方法进行回调。

本质上是一个方法,只是没有名字,任何使用委托变量的地方都可以使用匿名方法赋值。

例:

static int Test1(int arg1, int arg2)



return arg1 + arg2;



Func<int,int,int>plus = Test1;

改为:

Func<int,int,int>plus = delegate(int arg1,int arg2)



return arg1 +arg2;


2.Lambda表达式

用来代替匿名方法。

lambda表达式的参数不需要声明类型

Func<int,int,int>plus = (arg1,arg2)=>



return arg1 +arg2;


3.【Event】事件

委托能声明一个局部变量,事件只能在类里面声明
例:

public delegate void MyDelegate();

public event MyDelegate mydelgate;//声明了一个委托类型的变量,作为类的成员。加上event

static void Main(string[] args)



Program p = new Program();

p.mydelgate = Test1;

p.mydelgate();

Console.ReadKey();


备注:观察者设计模式,被观察者设置一个委托(事件),观察者为委托注册自身方法

委托与事件的区别,事件不能在的外部触发,只能在类的内部。受限制的委托

4.【LINQ】查询代码

方法

from…in…查询的集合

where 查询的条件

select 结果集合返回

扩展方法:

var res = masterList.Where()//传递一个方法作为过滤,或者直接在里面写lambad表达式

联合查询:

from A in AA from B in BB

where A.? = B.?

select new输出项

------

from A in AA join B in BB

on A.? equals B.?

select new输出项

var res = masterList.SelectMany(m=>kongfuList,(m,k)=>new master = m,kongfu = k)

.Where(x=>x.master.kongfu==x.kongfu.Name &&x.kongfu.Power>90);

结果排序:

orderby m.age,mLeverl descending

var res = masterList.Where(m => m.level > 8&&m.Menpai == "丐帮").OrderBy(m => m.Age);

分组查询:

var res = from k in konfuList join m in masterList on k.Name equals m.Kongfu

into groups

select new kongfu =k, count = groups.Count(),key=g.key;

量词操作:

bool res = masterList.Any(m => m.Menpai == "长留")//只要一个条件符合返回true

5.【Json】存储和交换文本信息的语法。

using LitJson;

JsonData jsonData = JsonMapper.ToObject(File.ReadAllText("json技能信息.txt"))//jsonMapper去解析json文本

//jsondata对象代表一个数组或者一个对象

foreach(JsonData temp in jsonData)//在这里temp代表一个对象



JsonData idvalue = temp["id"]//通过字符串索引器可以取得键值对的值


一般会创建对象处理

calss Skill



public int id;

public override string ToString()



List<Skill> skillList = new List<Skill>();

foreach(JsonData temp in jsonData)



Skill skill = new Skill();

skill.id = id

skillList.Add(skill);



foreach(var temp in skillList)



输出


6.C#反射

【Reflection】反射

反射指程序可以访问、检测和修改它本身状态或行为的一种能力。

程序集包含模块,而模块包含类型,类型又包含成员。反射则提供了封装程序集、模块和类型的对象。

您可以使用反射动态地创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型。

然后,可以调用类型的方法或访问其字段和属性。

获取Type对象有两种方式:

Type t = myInstance.GetType();//通过类的实例来获取Type对象

在object类有一个GetType的方法,返回Type对象,因为所有类都是从object继承的,

所以我们可以在任何类型上使用GetType()来获取它的Type对象

Type t = typeof(ClassName);//直接通过typeof运算符和类名获取Type对象获取里面的属性。

Assembly类:

Assembly类在System.Reflection命名空间中定义,它允许访问给定程序集的元数据,

它也包含了可以加载和执行程序集。

7.C#属性,索引

【Accessor】

访问器包含一个 get 访问器或一个 set 访问器。

【Indexer】

访问器包含一个 get 访问器或一个 set 访问器。索引器返回或设置对象实例的一个特定值。带有this关键字,它指向对象实例。

8.C#委托

【Delegate】委托(Delegate)特别用于实现事件和回调方法。即可用静态方法,也可用普通方法。

定义一个委托相当于定义一个新类,所有可以定义类的地方都可以定义委托。

使用委托来调用对象方法。委托的多播使用,方法也可以调用委托

声明语法:delegate

例:

delegate int NumberChanger(int n);//声明委托

class......

public static int AddNum(int p)



num += p;

return num;



main......

NumberChanger nc1 = new NumberChanger(AddNum); // 创建委托实例

nc1(25); // 使用委托对象调用方法


【Func】内置的委托类型

引用了一个带有一个返回值的方法,它可以传递0或者多到16个参数类型,和一个返回类型。

【Action】内置的委托类型

委托引用了一个void返回类型的方法,它可以传递0或者多到16个参数类型。

指向带一个int参数的方法:Action a = PrintString

【Generic】泛型

9.C#特性

【Conditional】【Obsolete】【DebuggerStepThrough】

【Attribute】

是用于在运行时传递程序中各种元素(比如类、方法、结构、枚举、组件等)的行为信息的声明 性标签。您可以通过使用特性向程序添加声明性信息。一个声明性标签是通过放置在它所应用的元素前面 的方括号([ ])来描述的。

预定义特性:

Conditional:这个预定义特性标记了一个条件方法,其执行依赖于指定的预处理标识符。

例:

#define DEBUG //定义DEBUG

public class Myclass



[Conditional("DEBUG")] //如果没有定义DEBUG,则方法语句不运行

public static void Message(string msg)



Console.WriteLine(msg);




Obsolete:这个预定义特性标记不应被使用的程序实体。它可以让您通知编译器丢弃某个特定的目标元素。

[Obsolete("Don't use OldMethod, use NewMethod instead", true)]

static void OldMethod()



Console.WriteLine("It is the old method");



//当尝试编译时,编译器会给出一个错误消息说明,如上。

AttributeUsage:

语法如下:

[AttributeUsage(

validon, //规定特性可被放置的语言元素,枚举类型。

AllowMultiple=allowmultiple, //提供一个布尔值。如果为 true,则该特性是多用的。默认false。

Inherited=inherited //提供一个布尔值。如果为 true,则该特性可被派生类继承。默认false。

)]

创建自定义特性

声明自定义特性:AttributeUsage

构建自定义特性:创建一个类继承 System.Attribute

调用者信息特性

调用者信息特性可以访问文件路径,代码行数,调用成员的名称等源代码信息。

这个三个特性名称为CallerFilePath,CallerLineNumber和CallerMemberName

这些特性只能用于方法中的可选参数

10.读取文件几种形式:

string nextLine = sr.ReadLine();//读取一行字符串

string restOfStream = sr.ReadToEnd();//读取流中所有剩余的文本内容

int nextChar = sr.Read();//只读取一个字符

int nChars = 100;

char[] charArray = new char[nChars];

int nCharsRead = sr.Read(charArray,0,nChars); 读取多个字符,第一个参数是要存放的字符数组,

第二个参数是从数组哪一个索引开始放,第三个参数是读取多少个字符 返回值是实际读取的字符的个数

以上是关于百分之九十的人不知道?在Python中f-string的几个技巧的主要内容,如果未能解决你的问题,请参考以下文章

相信应该有百分九十的男生看见这个东西是这个状态吧?

那些被刻意“阉割”的名人名言

Android Studio 调试

Android Studio 调试

前端面试百分之九十九过的技巧

Sprint总结和第八九十的读书笔记