首页 > 其他分享 >React jsx 语法解析 & 转换原理

React jsx 语法解析 & 转换原理

时间:2024-03-06 16:56:28浏览次数:23  
标签:语法 gt return name h2 React lt jsx

jsx介绍

jsx是一种JavaScript的语法扩展(eXtension),也在很多地方称之为JavaScript XML,因为看起就是一段XML语法,用于描述UI界面,并且可以和JavaScript代码结合使用。

比起vue中的模板语法,更加灵活,且不需要学习模板语法中的特定标签,比如:v-ifv-forv-bind等,而是直接使用JavaScript语法就可以实现这些标签的功能。

为何React中编写UI界面需要使用jsx语法呢

因为原生html和js两者是密不可分的两个部分,比如操作html元素时:

  1. 使用js选中元素,然后修改元素;
  2. 元素上绑定有事件时,需要绑定对应的事件函数;
  3. js中某些数据发生变化时,需要修改html元素。

索性,React直接将两者组合在一起进行管理。

jsx语法

书写规范

  1. 顶层只允许有一个根元素,和vue2类似;
  2. 为了方便阅读,通常在外层包裹一个 ()
  3. 可以使用单标签和双标签,但是单标签一定要包含结束符号,如:<button/>
// 定义App根组件
class App extends React.Component {
  render() {
	{/* 2.return外层,最好包裹一个() */}
	return (
	  {/* 1.顶层只允许有一个根元素 */}
	  <div>
		  {/* 3.支持单标签和双标签 */}
		  <h2>h2</h2>
		  <br/>
		</div>
	  </div>
	)
  }
}

基本使用

1.添加注释

在jsx中,添加注释使用这样的格式:

{/* 注释内容 */}

2.使用变量

  1. 当变量是Number、String、Array类型时,可以直接显示
  2. 当变量是null、undefined、Boolean类型时,内容显示为空,如果需要显示,需要转换为字符串;
  3. Object对象类型不能作为子元素(not valid as a React child)
class App extends React.Component {
	constructor() {
	  super()
	  this.state = {
		// Number/String/Array类型
		name: 'easylee',
		age: 18,
		movies: ['xxx', 'xxx'],
	<span class="hljs-comment">// null/undefined/boolean类型</span>
	<span class="hljs-attr">varNull</span>: <span class="hljs-literal">null</span>,
	<span class="hljs-attr">varUndefined</span>: <span class="hljs-literal">undefined</span>,
	<span class="hljs-attr">varBoolean</span>: <span class="hljs-literal">true</span>,

	<span class="hljs-comment">// Object对象</span>
	<span class="hljs-attr">friends</span>: { <span class="hljs-attr">name</span>: <span class="hljs-string">'foo'</span> },
  }
}

<span class="hljs-title function_">render</span>(<span class="hljs-params"></span>) {
  <span class="hljs-keyword">const</span> { name, age, movies } = <span class="hljs-variable language_">this</span>.<span class="hljs-property">state</span>
  <span class="hljs-keyword">const</span> { varNull, varUndefined, varBoolean } = <span class="hljs-variable language_">this</span>.<span class="hljs-property">state</span>
  <span class="hljs-keyword">const</span> { friends } = <span class="hljs-variable language_">this</span>.<span class="hljs-property">state</span>

  <span class="hljs-keyword">return</span> (
	<span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">div</span>&gt;</span>
	  {/* 正常显示 */}
	  <span class="hljs-tag">&lt;<span class="hljs-name">h2</span>&gt;</span>name: {name}<span class="hljs-tag">&lt;/<span class="hljs-name">h2</span>&gt;</span>
	  <span class="hljs-tag">&lt;<span class="hljs-name">h2</span>&gt;</span>age: {age}<span class="hljs-tag">&lt;/<span class="hljs-name">h2</span>&gt;</span>
	  <span class="hljs-tag">&lt;<span class="hljs-name">h2</span>&gt;</span>movies: {movies}<span class="hljs-tag">&lt;/<span class="hljs-name">h2</span>&gt;</span>

	  {/* 显示为空 */}
	  <span class="hljs-tag">&lt;<span class="hljs-name">h2</span>&gt;</span>null: {varNull}<span class="hljs-tag">&lt;/<span class="hljs-name">h2</span>&gt;</span>
	  <span class="hljs-tag">&lt;<span class="hljs-name">h2</span>&gt;</span>undefined: {varUndefined}<span class="hljs-tag">&lt;/<span class="hljs-name">h2</span>&gt;</span>
	  <span class="hljs-tag">&lt;<span class="hljs-name">h2</span>&gt;</span>Boolean: {varBoolean}<span class="hljs-tag">&lt;/<span class="hljs-name">h2</span>&gt;</span>

	  {/* 显示为字符串 */}
	  <span class="hljs-tag">&lt;<span class="hljs-name">h2</span>&gt;</span>null: {varNull + ''}<span class="hljs-tag">&lt;/<span class="hljs-name">h2</span>&gt;</span>
	  <span class="hljs-tag">&lt;<span class="hljs-name">h2</span>&gt;</span>undefined: {String(varUndefined)}<span class="hljs-tag">&lt;/<span class="hljs-name">h2</span>&gt;</span>
	  <span class="hljs-tag">&lt;<span class="hljs-name">h2</span>&gt;</span>Boolean: {varBoolean.toString()}<span class="hljs-tag">&lt;/<span class="hljs-name">h2</span>&gt;</span>

	  {/* 对象不允许直接作为子元素,必须具体到对象的属性 */}
	  {/* <span class="hljs-tag">&lt;<span class="hljs-name">h2</span>&gt;</span>friends: {friends}<span class="hljs-tag">&lt;/<span class="hljs-name">h2</span>&gt;</span> */}
	  <span class="hljs-tag">&lt;<span class="hljs-name">h2</span>&gt;</span>friends: {friends.name}<span class="hljs-tag">&lt;/<span class="hljs-name">h2</span>&gt;</span>
	<span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span></span>
  )
}

}
const root = ReactDOM.createRoot(document.querySelector('#root'))
root.render(<App />)

3.使用表达式

和vue中使用模板语法一样,只有可以放在 return 后的语句,都是表达式,可以直接在jsx中使用。

主要包含:

  1. 运算表达式;
  2. 三元表达式;
  3. 可执行函数。
class App extends React.Component {
	constructor() {
	  super()
	  this.state = {
		firstName: 'easy',
		lastName: 'lee',
		age: 18,
		movies: ['foo', 'bar'],
	  }
	}
<span class="hljs-title function_">getMovies</span>(<span class="hljs-params"></span>) {
  <span class="hljs-keyword">return</span> <span class="hljs-variable language_">this</span>.<span class="hljs-property">state</span>.<span class="hljs-property">movies</span>
}

<span class="hljs-title function_">render</span>(<span class="hljs-params"></span>) {
  <span class="hljs-keyword">const</span> { firstName, lastName, age } = <span class="hljs-variable language_">this</span>.<span class="hljs-property">state</span>

  <span class="hljs-keyword">return</span> (
	<span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">div</span>&gt;</span>
	  {/* 表达式 */}
	  <span class="hljs-tag">&lt;<span class="hljs-name">h2</span>&gt;</span>{1 + 1}<span class="hljs-tag">&lt;/<span class="hljs-name">h2</span>&gt;</span>
	  <span class="hljs-tag">&lt;<span class="hljs-name">h2</span>&gt;</span>{firstName + ' ' + lastName}<span class="hljs-tag">&lt;/<span class="hljs-name">h2</span>&gt;</span>
	  <span class="hljs-tag">&lt;<span class="hljs-name">h2</span>&gt;</span>{age &gt;= 18 ? '成年' : '未成年'}<span class="hljs-tag">&lt;/<span class="hljs-name">h2</span>&gt;</span>
	  <span class="hljs-tag">&lt;<span class="hljs-name">h2</span>&gt;</span>{this.getMovies()}<span class="hljs-tag">&lt;/<span class="hljs-name">h2</span>&gt;</span>
	<span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span></span>
  )
}

}

4.绑定属性

给html元素或者组件添加属性,和直接使用变量类似,都使用{}包裹即可,绑定 classstyle 有一点不同:

  1. 基本属性,直接绑定即可;
  2. class属性,需要使用 className 代替 class ,因为class在js中也表示类;
  3. style属性,需要传递一个对象。
class App extends React.Component {
	constructor() {
	  super()
  <span class="hljs-variable language_">this</span>.<span class="hljs-property">state</span> = {
	<span class="hljs-attr">title</span>: <span class="hljs-string">'title'</span>,
	<span class="hljs-attr">imgUrl</span>: <span class="hljs-string">'http://xxx.xxx.xxx'</span>,
	<span class="hljs-attr">isActive</span>: <span class="hljs-literal">true</span>,
	<span class="hljs-attr">objStyle</span>: { <span class="hljs-attr">color</span>: <span class="hljs-string">'red'</span>, <span class="hljs-attr">fontSize</span>: <span class="hljs-string">'20px'</span> },
  }
}

<span class="hljs-title function_">render</span>(<span class="hljs-params"></span>) {
  <span class="hljs-keyword">const</span> { title, imgUrl, isActive, objStyle } = <span class="hljs-variable language_">this</span>.<span class="hljs-property">state</span>
  <span class="hljs-keyword">const</span> className = <span class="hljs-string">`foo <span class="hljs-subst">${isActive ? <span class="hljs-string">'active'</span> : <span class="hljs-string">''</span>}</span>`</span>
  <span class="hljs-keyword">return</span> (
	<span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">div</span>&gt;</span>
	  {/* 基本属性绑定 */}
	  <span class="hljs-tag">&lt;<span class="hljs-name">h2</span> <span class="hljs-attr">title</span>=<span class="hljs-string">{title}</span>&gt;</span>h2<span class="hljs-tag">&lt;/<span class="hljs-name">h2</span>&gt;</span>
	  <span class="hljs-tag">&lt;<span class="hljs-name">img</span> <span class="hljs-attr">src</span>=<span class="hljs-string">{imgUrl}</span> /&gt;</span>

	  {/* 绑定class属性 */}
	  <span class="hljs-tag">&lt;<span class="hljs-name">h2</span> <span class="hljs-attr">className</span>=<span class="hljs-string">'className'</span>&gt;</span>h2<span class="hljs-tag">&lt;/<span class="hljs-name">h2</span>&gt;</span>

	  {/* 绑定style属性,objStyle必须是一个对象 */}
	  <span class="hljs-tag">&lt;<span class="hljs-name">h2</span> <span class="hljs-attr">style</span>=<span class="hljs-string">{objStyle}</span>&gt;</span>h2<span class="hljs-tag">&lt;/<span class="hljs-name">h2</span>&gt;</span>
	<span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span></span>
  )
}

}

5.绑定事件

React中绑定事件需要使用小驼峰格式。

class App extends React.Component {
	constructor() {
	  super()
  <span class="hljs-variable language_">this</span>.<span class="hljs-property">state</span> = {
	<span class="hljs-attr">name</span>: <span class="hljs-string">'easylee'</span>,
  }
}
<span class="hljs-title function_">btnClick</span>(<span class="hljs-params"></span>) {
  <span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(<span class="hljs-string">'btnClick'</span>)
}
<span class="hljs-title function_">btnClick2</span>(<span class="hljs-params"></span>) {
  <span class="hljs-variable language_">this</span>.<span class="hljs-title function_">setState</span>({
	<span class="hljs-attr">name</span>: <span class="hljs-string">'easy'</span>,
  })
}
<span class="hljs-title function_">btnClick3</span>(<span class="hljs-params">event, name, age</span>) {
  <span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(event, name, age)
}
<span class="hljs-title function_">render</span>(<span class="hljs-params"></span>) {
  <span class="hljs-keyword">return</span> (
	<span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">div</span>&gt;</span>
	  {/* 事件绑定基本使用 */}
	  <span class="hljs-tag">&lt;<span class="hljs-name">button</span> <span class="hljs-attr">onClick</span>=<span class="hljs-string">{this.btnClick}</span>&gt;</span>按钮<span class="hljs-tag">&lt;/<span class="hljs-name">button</span>&gt;</span>
	  <span class="hljs-tag">&lt;<span class="hljs-name">button</span> <span class="hljs-attr">onClick</span>=<span class="hljs-string">{()</span> =&gt;</span> this.btnClick2()}&gt;按钮<span class="hljs-tag">&lt;/<span class="hljs-name">button</span>&gt;</span>
	  <span class="hljs-tag">&lt;<span class="hljs-name">h2</span>&gt;</span>{this.state.name}<span class="hljs-tag">&lt;/<span class="hljs-name">h2</span>&gt;</span>

	  {/* 传递参数 */}
	  <span class="hljs-tag">&lt;<span class="hljs-name">button</span> <span class="hljs-attr">onClick</span>=<span class="hljs-string">{event</span> =&gt;</span> this.btnClick3(event, 'easylee', 18)}&gt;按钮<span class="hljs-tag">&lt;/<span class="hljs-name">button</span>&gt;</span>
	<span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span></span>
  )
}

}

上例代码中,当我们绑定的函数体内部使用了this,传递给onClick的函数需要绑定指定的this,通常有下面几种方式进行绑定,原因和解决方法具体可以看:https://www.cnblogs.com/easy1996/p/17952054。

同时,给绑定函数传递参数时,onClick会默认给绑定的函数第一个参数传递 event 参数。

6.条件渲染

jsx中条件渲染可以使用多种方式:

  1. 直接使用JavaScript if进行条件判断;
  2. 使用三元运算符;
  3. 使用逻辑运算符。
class App extends React.Component {
	constructor() {
	  super()
  <span class="hljs-variable language_">this</span>.<span class="hljs-property">state</span> = {
	<span class="hljs-attr">isOk</span>: <span class="hljs-literal">true</span>,
	<span class="hljs-attr">friend</span>: { <span class="hljs-attr">name</span>: <span class="hljs-string">'foo'</span> },
  }
}
<span class="hljs-title function_">render</span>(<span class="hljs-params"></span>) {
  <span class="hljs-keyword">const</span> { isOk, friend } = <span class="hljs-variable language_">this</span>.<span class="hljs-property">state</span>
  <span class="hljs-keyword">let</span> showContent = <span class="hljs-literal">null</span>
  <span class="hljs-keyword">if</span> (isOk) {
	showContent = <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">h2</span>&gt;</span>正常<span class="hljs-tag">&lt;/<span class="hljs-name">h2</span>&gt;</span></span>
  } <span class="hljs-keyword">else</span> {
	showContent = <span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">h2</span>&gt;</span>异常<span class="hljs-tag">&lt;/<span class="hljs-name">h2</span>&gt;</span></span>
  }

  <span class="hljs-keyword">return</span> (
	<span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">div</span>&gt;</span>
	  {/* 1.使用if进行判断,注意渲染函数中不能使用if判断,应该写在render()外 */}
	  <span class="hljs-tag">&lt;<span class="hljs-name">h2</span>&gt;</span>{showContent}<span class="hljs-tag">&lt;/<span class="hljs-name">h2</span>&gt;</span>

	  {/* 2.三元运算符 */}
	  <span class="hljs-tag">&lt;<span class="hljs-name">h2</span>&gt;</span>{isOk ? <span class="hljs-tag">&lt;<span class="hljs-name">span</span>&gt;</span>正常<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span> : <span class="hljs-tag">&lt;<span class="hljs-name">span</span>&gt;</span>异常<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span>}<span class="hljs-tag">&lt;/<span class="hljs-name">h2</span>&gt;</span>

	  {/* 3.&amp;&amp;逻辑与判断,为空或者undefined时,就会默认不显示 */}
	  <span class="hljs-tag">&lt;<span class="hljs-name">h2</span>&gt;</span>{friend &amp;&amp; <span class="hljs-tag">&lt;<span class="hljs-name">span</span>&gt;</span>{friend.name}<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span>}<span class="hljs-tag">&lt;/<span class="hljs-name">h2</span>&gt;</span>
	<span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span></span>
  )
}

}

7.列表渲染

列表渲染通常使用高阶函数,比如 mapfilter等,通过前面的介绍,我们知道表达式可以直接在 {} 中使用,直接使用这些高阶函数即可渲染列表。

class App extends React.Component {
	constructor() {
	  super()
  <span class="hljs-variable language_">this</span>.<span class="hljs-property">state</span> = {
	<span class="hljs-attr">list</span>: [
	  {
		<span class="hljs-attr">name</span>: <span class="hljs-string">'easylee'</span>,
		<span class="hljs-attr">age</span>: <span class="hljs-number">18</span>,
	  },
	  {
		<span class="hljs-attr">name</span>: <span class="hljs-string">'foo'</span>,
		<span class="hljs-attr">age</span>: <span class="hljs-number">20</span>,
	  },
	],
  }
}
<span class="hljs-title function_">render</span>(<span class="hljs-params"></span>) {
  <span class="hljs-keyword">const</span> { list } = <span class="hljs-variable language_">this</span>.<span class="hljs-property">state</span>
  <span class="hljs-keyword">return</span> (
	<span class="language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">ul</span>&gt;</span>
	  {list.map(item =&gt; {
		return (
		  <span class="hljs-tag">&lt;<span class="hljs-name">li</span> <span class="hljs-attr">key</span>=<span class="hljs-string">{item.name}</span>&gt;</span>
			<span class="hljs-tag">&lt;<span class="hljs-name">h2</span>&gt;</span>name: {item.name}<span class="hljs-tag">&lt;/<span class="hljs-name">h2</span>&gt;</span>
			<span class="hljs-tag">&lt;<span class="hljs-name">h2</span>&gt;</span>age: {item.age}<span class="hljs-tag">&lt;/<span class="hljs-name">h2</span>&gt;</span>
		  <span class="hljs-tag">&lt;/<span class="hljs-name">li</span>&gt;</span>
		)
	  })}
	<span class="hljs-tag">&lt;/<span class="hljs-name">ul</span>&gt;</span></span>
  )
}

}

上面代码中,{} 内通过高阶函数,获取到一个 li 元素数组,然后直接渲染这个数组,即完成了列表的渲染。

当然也可以把高阶函数这块代码提取到其它地方或者创建一个函数专门生成 li 元素数组。

同时需要注意,和vue一样,列表元素都需要设置一个 key ,以提高diff算法时的效率。

jsx转换原理

jsx通过babel进行转换,仅仅是一个语法糖,本质上,所有的jsx代码最终都将转换为 React.createElement(type, config, children)函数,这个函数包含三个参数:

  1. type:当前元素的类型,比如div就传div,组件就传组件名;
  2. config:当前元素的各种属性,比如class属性,src属性等;
  3. children:当前元素的下级元素,比如ul下的li,里面又是一个React.createElement(type, config, children)函数,是嵌套的结构。

以这段代码为例:

class App extends React.Component {
	// ...
	render() {
	  return (
		<div>
		  <div className='header'>Header</div>
		  <ul className='Content'>
			<li>列表数据1</li>
			<li>列表数据2</li>
		  </ul>
		</div>
	  )
	}
}

render函数渲染中return的部分,最终会转换为React.createElement函数,直接放到return中,渲染结果一样:

render() {
  return React.createElement(
	'div',
	null,
	React.createElement(
	  'div',
	  {
		className: 'header',
	  },
	  'Header',
	),
	React.createElement(
	  'ul',
	  {
		className: 'Content',
	  },
	  React.createElement('li', null, '\u5217\u8868\u6570\u636E1'),
	  React.createElement('li', null, '\u5217\u8868\u6570\u636E2'),
	),
  )
}

这个代码,可以通过babel在线转换查看:Babel · The compiler for next generation JavaScript

可以直接编写 React.createElement 来生成UI界面,从而不使用babel转换。

通过上面的 React.createElement 函数,可以创建出一个 ReactElement对象,React利用ReactElement对象组成JavaScript的对象树,这个对象树就是虚拟DOM

编写jsx代码,然后调用createElement函数创建ReactElement对象,react再经过一些处理,最终使用JavaScript的createElement方法,再转换为真实DOM。

标签:语法,gt,return,name,h2,React,lt,jsx
From: https://www.cnblogs.com/mounterLove/p/18056931

相关文章

  • React Hooks 钩子特性及应用场景
    Hooks是React16.8的新增特性。它可以让你在不编写class组件的情况下使用state以及其他的React特性。ReactHooks表现形式是以use开头的函数被称为Hook。useState是React提供的一个内置Hook。你可以在ReactAPI参考中找到其他内置的Hook。你也可以通过组合......
  • React—组件通信
    一、父传子(Props)父组件可以通过props将数据传递给子组件。这是React中最常见的一种方式,适用于父子组件之间的数据传递。{/*组件传递:父传子*/}{/*1.父组件传递数据子组件标签上绑定属性*/}{/*2.子组件接收数据props(props对象里包含了父组件传......
  • Markdown语法的一些基本使用
    标题(最多到六级标题,都是若干个#号+空格+标题名称):一级标题二级标题三级标题四级标题五级标题六级标题引用(>号后直接加文字):那就引用一下把我自横刀向天笑,去留肝胆两昆仑有序列表(数字+.号+空格+文字):第一步第二步无序列表(-号或*号+空格+文字):弟弟宝宝任务列表......
  • 学习 Day1 MarkDown语法练习
    学习Day1MarkDown语法练习Day1,了解了MarkDown的基本语法,为日后的学习做准备。标题语法使用'#'号来标出标题的等级,如:一级标题为('#'+空格),二级标题为('##'+空格)例如:二级标题三级标题字体语法使用特定的语法给字体增加样式加粗字体(使用'**'号)倾斜字体(使用'*'号)......
  • React 高阶组件、Render props、hooks 有什么区别?
    这三者是目前react解决代码复用的主要方式:高阶组件(hoc)官方解释:高阶组件(HOC)是React中用于复用组件逻辑的一种高级技巧。HOC自身不是ReactAPI的一部分,它是一种基于React的组合特性而形成的设计模式。简言之,HOC是一种组件的设计模式,HOC接受一个组件和额外的......
  • React的7个常用Hooks及使用场景(含示例)
    React是一款非常流行的JavaScript库,它提供了许多Hooks,用于管理函数组件的状态和生命周期。下面是React的每个Hooks的使用场景和示例:No1、useStateuseState用于在函数组件中管理状态。它返回一个包含当前状态和一个更新状态的函数的数组。更新状态的函数可以接受一个新的值......
  • 1.Python3 基础语法
    Python3基础语法Python3中文官方文档https://docs.python.org/zh-cn/3.9/Python标准库https://docs.python.org/zh-cn/3.9/library/index.html1.Python保留字保留字即关键字,我们不能把它们用作任何标识符名称。Python的标准库提供了一个keyword模块,可以输出当前版本的......
  • dart特殊符号语法(一)
    许久没有写博客。浏览以往的博客,是那么稚嫩。就让它们当成成长的照片吧。重新开始操起这个记录的爱好,一方面把它当成可以查阅的资料,方便自己;另一方面希望有帮助于人。由于个人能力,认知有限,如读者发现有纰缪之处,希望不吝指教。今天分享下dart语言中的特殊符号语法使用。?(问号)(Quest......
  • python 语法之 print 函数和 input 函数
    print函数input函数案例一:圆的周长importmaths=input("圆的半径:\n")s=float(s)c=2*math.pi*sprint(f"圆的周长,{c:.2f}")w=input("请输入天气情况(可选项:晴、阴):")ifw=="晴天":print("play")else:print(f"天气{w}不玩")......
  • python基础语法
    (1)注释注释就是对代码的解释和说明,其目的是让人们能够更加轻松地了解代码。注释是编写程序时,写程序的人给一个语句、程序段、函数等的解释或提示,能提高程序代码的可读性。一般情况下,合理的代码注释应该占源代码的1/3左右。注释只是为了提高公认阅读,不会被解释器执行。Python......