lisp里每个表达式均有值,而python3里为什么这种很平常的表达式却没有返回值呢?
回复内容:
首先,因为你在用C/C++的思维理解python。没有就是没有,返回值的提法也不对,返回值是函数的结果。准确说应该是表达式值。
语言的语法是人定义的,赋值是assignment statement,不是expression,所以没有值。
另外,在python里面function_name(var=????)是有特殊的语义的,它指的是function_name的var参数的实参是????。
例如
<span class="k">def</span> <span class="nf">f</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">):</span>
<span class="k">return</span> <span class="nb">str</span><span class="p">(</span><span class="n">x</span><span class="p">)</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">y</span><span class="p">)</span>
楼上的各位解释的已经很清楚了,总结一下就是:python中赋值就是赋值,他不是一个表达式,也就不会返回一个表达式的值。
这样做的一个好处是让语法更加清晰。
在C中存在一个“行内赋值”的问题,举个栗子:你打算判断x的值是否等于1000, 如果等于1000则返回真,如果不等则返回假,正确的代码应该是:
<span class="cp">#include<stdio.h></span>
<span class="kt">void</span> <span class="nf">main</span><span class="p">(){</span>
<span class="kt">int</span> <span class="n">x</span> <span class="o">=</span> <span class="mi">200</span><span class="p">;</span>
<span class="k">if</span><span class="p">(</span><span class="n">x</span> <span class="o">==</span> <span class="mi">1000</span><span class="p">)</span>
<span class="n">printf</span><span class="p">(</span><span class="s">"true"</span><span class="p">);</span>
<span class="k">else</span>
<span class="n">printf</span><span class="p">(</span><span class="s">"false"</span><span class="p">);</span>
<span class="p">}</span>
你要理解为b=a=1是一个语句,而不是表达式。
In [1]: def foo():
...: a = b = 1
...:
In [2]: from dis import dis
In [3]: dis(foo)
2 0 LOAD_CONST 1 (1)
3 DUP_TOP
4 STORE_FAST 0 (a)
7 STORE_FAST 1 (b)
10 LOAD_CONST 0 (None)
13 RETURN_VALUE
赋值语句没有返回值,所以不是表达式,这是因为赋值语句不需要返回值, Python 既不是 C 也不是 Lisp。即使有返回值的 Lisp ,返回值一般也是 '(),这就告诉你不要想用返回值做什么事,其实和 Python 的思想是一样的。
区别是 Python 用一个语法错误来防止程序员干蠢事而已。
Why does Python assignment not return a value?
链式赋值的逻辑不是先求值右侧的表达式再赋给左侧,仅仅是一种语法而已。下面可以看到,赋值的语句的解析显然不是递归的。
Simple statements
assignment_stmt ::= (target_list "=")+ (expression_list | yield_expression)
为什么在python3里b=a=1是合理表达式
链式赋值只是一种语法结构 他并不是跟cpp一样"把1赋给a 再把a的值赋给b"而是把1赋给b和a
而print(a=1)却不是
这句话的意思是把1赋给print的形参a 而不是像cpp那样“把1赋给局部变量a 再把a的值传进去”a=1为什么没有返回值
a=1在cpp里面是表达式(expression) 在py里面叫语句(statement)语句就像cpp的"return xxx;"一样 不必要有值
另外表达式的值也不叫返回值 因为Python语言的设计者认为赋值最重要的作用是其副作用,不应该像表达式那样有返回值.详见:https://docs.python.org/3/faq/design.html?highlight=assignment#why-can-t-i-use-an-assignment-in-an-expression
- Python的赋值语句是没有返回值的,而且很多语言都没有,这并不是编程语言界的规定或者惯例。
- 你的那个
<span class="x">print(a=1)</span> <span class="x">--------------------------------------------------------------------------</span> <span class="x">TypeError Traceback (most recent call last)</span> <span class="x"><ipython-input-4-ab52a41c9aa5> in <module>()</span> <span class="x">----> 1 print(a=1)</span> <span class="x">TypeError: 'a' is an invalid keyword argument for this function</span>
<span class="k">if</span><span class="p">(</span> <span class="n">x</span> <span class="o">=</span> <span class="mi">1</span> <span class="p">)</span> <span class="p">{</span> <span class="c">#do.... } </span>

Python在web開發、數據科學、機器學習、自動化和腳本編寫等領域有廣泛應用。 1)在web開發中,Django和Flask框架簡化了開發過程。 2)數據科學和機器學習領域,NumPy、Pandas、Scikit-learn和TensorFlow庫提供了強大支持。 3)自動化和腳本編寫方面,Python適用於自動化測試和系統管理等任務。

兩小時內可以學到Python的基礎知識。 1.學習變量和數據類型,2.掌握控制結構如if語句和循環,3.了解函數的定義和使用。這些將幫助你開始編寫簡單的Python程序。

如何在10小時內教計算機小白編程基礎?如果你只有10個小時來教計算機小白一些編程知識,你會選擇教些什麼�...

使用FiddlerEverywhere進行中間人讀取時如何避免被檢測到當你使用FiddlerEverywhere...

Python3.6環境下加載Pickle文件報錯:ModuleNotFoundError:Nomodulenamed...

如何解決jieba分詞在景區評論分析中的問題?當我們在進行景區評論分析時,往往會使用jieba分詞工具來處理文�...

如何使用正則表達式匹配到第一個閉合標籤就停止?在處理HTML或其他標記語言時,常常需要使用正則表達式來�...

攻克Investing.com的反爬蟲策略許多人嘗試爬取Investing.com(https://cn.investing.com/news/latest-news)的新聞數據時,常常�...


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

SecLists
SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

記事本++7.3.1
好用且免費的程式碼編輯器

Dreamweaver CS6
視覺化網頁開發工具

Atom編輯器mac版下載
最受歡迎的的開源編輯器

SublimeText3漢化版
中文版,非常好用