百分之九十的人不知道?在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的几个技巧的主要内容,如果未能解决你的问题,请参考以下文章